在绑定到DataTrigger时忽略INotifyPropertyChanged

时间:2012-10-18 22:06:04

标签: wpf xaml binding datatrigger

我正在处理一些代码,其中包含一个包含图像和一些文本的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事件。

有什么想法吗?

3 个答案:

答案 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()中确定拼写了属性的名称。

不好意思。