2012-12-12 135 views
0

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

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

  • 绿色亮起,当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来定义颜色和文本。

+0

您的代码有效。你有没有设置DataContext?你确定你的OnPropertyChanged是正确实施吗? – LPL

+0

它的工作原理?呵呵。我确定我正确地设置了DataContext,但是一旦我今天下午回家,我会看看OnPropertyChanged。 – Mirek

+0

为什么OnPropertyChanged没有参数?该方法如何知道哪个属性发生了变化? PS:此代码也适用于我;) –

回答

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。