我正在处理一些代码,其中包含一个包含图像和一些文本的Button,它应该显示图像,文本或两者,具体取决于绑定属性的值。该代码目前正在使用Styles和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事件。
有什么想法吗?
答案 0 :(得分:2)
在每个数据触发器上尝试NotifyOnSourceUpdated = True。
<DataTrigger Binding="{Binding Path=buttonStyle, NotifyOnSourceUpdated=True}"
Value="{x:Static local:ButtonStyle.Text}">
<Setter Property="Visibility" Value="Collapsed" />
</DataTrigger>
答案 1 :(得分:1)
我认为这是一种更好的方式来引用DataTrigger中的枚举:
<Style x:Key="buttonImageStyle" TargetType="{x:Type Image}">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=buttonStyle}">
<DataTrigger.Value>
<local:ButtonStyle>Text</local:ButtonStyle>
</DataTrigger.Value>
<Setter Property="Visibility" Value="Collapsed" />
</DataTrigger>
</Style.Triggers>
</Style>
资源的值在运行时更改,这就是为什么你应该使用DynamicResource而不是StaticResource:
Style="{DynamicResource buttonImageStyle}"
答案 2 :(得分:1)
这是一个想法 - 任何时候你遇到绑定问题并且看起来像INotifyPropertyChanged不起作用,检查并仔细检查并确保你在PropertyChangedEventArgs()中确定拼写了属性的名称。
不好意思。