Я работаю над некоторым кодом, который имеет кнопку, содержащую изображение и некоторый текст, и который должен отображать либо изображение, либо текст, либо и то, и другое, в зависимости от значения связанного свойства. Код в настоящее время использует стили и DataTriggers:
public enum ButtonStyle { Image, Text, Both };
public class ViewModel : INotifyPropertyChanged
{
private ButtonStyle _buttonStyle;
public ButtonStyle buttonStyle
{
get { return this._buttonStyle; }
set
{
this._buttonStyle = value;
notifyPropertyChanged("buttonStyle");
}
}
А также:
<UserControl.Resources>
<Style x:Key="buttonTextStyle" TargetType="{x:Type Label}">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=buttonStyle}"
Value="{x:Static local:ButtonStyle.Text}">
<Setter Property="Visibility" Value="Collapsed" />
</DataTrigger>
</Style.Triggers>
</Style>
<Style x:Key="buttonImageStyle" TargetType="{x:Type Image}">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=buttonStyle}"
Value="{x:Static local:ButtonStyle.Image}">
<Setter Property="Visibility" Value="Collapsed" />
</DataTrigger>
</Style.Triggers>
</Style>
</UserControl.Resources>
<Button>
<StackPanel>
<Image Source="..." Style="{StaticResource buttonImageStyle} />
<Label Style={StaticResource buttonTextStyle}>My Text</Label>
</StackPanel>
</Button>
Моя проблема? Кнопка не меняется, когда я изменяю значение свойства buttonStyle в модели представления. Этот элемент управления находится на вкладке, и если я переключусь на другую вкладку, а затем переключусь обратно, кнопка обновится, чтобы отразить текущее значение свойства buttonStyle, но оно не изменится, пока я этого не сделаю.
Похоже, что DataTrigger обрабатывается только при визуализации элемента управления и не выполняет повторную визуализацию при изменении связанного значения, несмотря на то, что связанное значение вызывает событие PropertyChanged.
Есть идеи?