2012-12-12 133 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。