1

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

有任何想法吗?

4

3 回答 3

2

在每个数据触发器上尝试 NotifyOnSourceUpdated=True。

        <DataTrigger Binding="{Binding Path=buttonStyle, NotifyOnSourceUpdated=True}"
                Value="{x:Static local:ButtonStyle.Text}">
            <Setter Property="Visibility" Value="Collapsed" />
        </DataTrigger>
于 2012-10-18T22:42:06.710 回答
1

这是一个想法 - 任何时候您遇到绑定问题并且看起来 INotifyPropertyChanged 不起作用,请检查并仔细检查并确保您在 PropertyChangedEventArgs() 中拼写了产权名称。

抱歉,添麻烦了。

于 2012-10-19T16:29:01.743 回答
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}"
于 2012-10-19T07:05:14.340 回答