0

我有一个按钮,并且在名为 BooleanSwitch 的视图模型中有一个布尔属性。

我希望按钮的文本和前景色是:

  • 绿色 ON,当 BooleanSwitch 为真时
  • 红色关闭,当 BooleanSwitch 为假时

我希望它在值变化时动态变化。

当然,我可以在代码隐藏中做到这一点。但是有没有一个 XAML 解决方案呢?我尝试了以下方法:

<Style x:Key="SwitchButtonStyle" TargetType="Button">
    <Style.Triggers>
        <DataTrigger Binding="{Binding Path=BooleanSwitch}" Value="true">
            <Setter Property="Foreground" Value="Red"/>
            <Setter Property="Content" Value="ON"/>
        </DataTrigger>
        <DataTrigger Binding="{Binding Path=BooleanSwitch}" Value="false">
            <Setter Property="Foreground" Value="#00AA00" />
            <Setter Property="Content" Value="OFF"/>
        </DataTrigger>
    </Style.Triggers>
</Style>


<Button Click="button_Click" Style="{DynamicResource SwitchButtonStyle}" />

而点击方法只是:

private void button_Click(object sender, RoutedEventArgs e)
{
    BooleanSwitch = !BooleanSwitch;
}

BooleanSwitch 的代码再简单不过了(.NET 4.5):

    private bool privateBooleanSwitch;
    public bool BooleanSwitch
    {
        get { return privateBooleanSwitch; }
        set
        {
            if (value == privateBooleanSwitch)
                return;

            privateBooleanSwitch= value;
            OnPropertyChanged();
        }
    }

加载后,触发器激活并且按钮为红色,但当我单击按钮时,它们不再工作......我可以看到我可能不太了解 DataTriggers 的工作原理。

我究竟做错了什么?

该按钮是一个单一用途的按钮,但我已经发现我不能在特定元素内使用 DataTrigger。我正在考虑创建另一个包含文本和颜色的属性,然后将它们绑定到按钮属性,但这在我看来只是不必要的代码定制,我宁愿使用 XAML 来定义颜色和文本。

4

1 回答 1

1

我。

哑的。

你猜怎么了。

public abstract class ViewModelBase
{
    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged([CallerMemberName] string propertyName = "")
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

我实际上实现了接口INotifyPropertyChanged但忘记在类定义中提及它。

public abstract class ViewModelBase : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged([CallerMemberName] string propertyName = "")
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

我没有在这里寻找错误,而是确定我对 WPF 触发器的理解一定存在错误。感谢LPL。

于 2012-12-13T16:30:09.183 回答