我有一个按钮,我在名为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来定义颜色和文本。
答案 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。