XAML样式绑定

时间:2012-12-12 21:21:51

标签: wpf xaml binding .net-4.5

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

我希望按钮的文字和前景色为:

  • 绿色ON,当BooleanSwitch为真时
  • red OFF,当BooleanSwitch为false时

我想让它在值改变时动态改变。

当然,我可以在代码隐藏中做到这一点。 但是有没有针对此的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来定义颜色和文本。

1 个答案:

答案 0 :(得分: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。