2012-10-18 36 views
1

我的工作具有包含一張圖片和一些文本的按鈕一些代碼,並應顯示無論是圖像,文本,或兩者兼而有之,這取決於綁定的值屬性。目前該代碼使用樣式和DataTriggers:INotifyPropertyChange忽視了綁定到DataTrigger

public enum ButtonStyle { Image, Text, Both }; 

public class ViewModel : INotifyPropertyChanged 
{ 
    private ButtonStyle _buttonStyle; 
    public ButtonStyle buttonStyle 
    { 
     get { return this._buttonStyle; } 
     set 
     { 
      this._buttonStyle = value; 
      notifyPropertyChanged("buttonStyle"); 
     } 
} 

和:

<UserControl.Resources> 
    <Style x:Key="buttonTextStyle" TargetType="{x:Type Label}"> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding Path=buttonStyle}" 
        Value="{x:Static local:ButtonStyle.Text}"> 
       <Setter Property="Visibility" Value="Collapsed" /> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
    <Style x:Key="buttonImageStyle" TargetType="{x:Type Image}"> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding Path=buttonStyle}" 
        Value="{x:Static local:ButtonStyle.Image}"> 
       <Setter Property="Visibility" Value="Collapsed" /> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
</UserControl.Resources> 


<Button> 
    <StackPanel> 
     <Image Source="..." Style="{StaticResource buttonImageStyle} /> 
     <Label Style={StaticResource buttonTextStyle}>My Text</Label> 
    </StackPanel> 
</Button> 

我的問題?當我更改視圖模型中buttonStyle屬性的值時,該按鈕不會更改。這種控制是一個選項卡,如果我切換到另一個選項卡,然後切換回來,按鈕將更新以反映按鈕樣式屬性的當前值,但它不會改變,直到我做的。

它看起來像DataTrigger只有當控件呈現,而當綁定值被修改,儘管綁定值養PropertyChanged事件不會重新渲染處理。

任何想法?

回答

1

這裏有一個想法 - 任何時候你有一個綁定的問題,它看起來像INotifyPropertyChanged不工作,檢查和仔細檢查,並使該死的確保你拼寫PropertyChangedEventArgs()中的產權名稱。

很抱歉的麻煩。

+0

:D它是否適用於'Style =「{DynamicResource buttonImageStyle}」'? –

+0

用StaticResource工作得很好,一旦我開始通知正確的屬性名稱。 –

+0

好的,那麼我真的沒有得到StaticResource和DynamicResource之間的區別... –

2

嘗試NotifyOnSourceUpdated =真對每個數據的觸發。

 <DataTrigger Binding="{Binding Path=buttonStyle, NotifyOnSourceUpdated=True}" 
       Value="{x:Static local:ButtonStyle.Text}"> 
      <Setter Property="Visibility" Value="Collapsed" /> 
     </DataTrigger> 
+0

試了一下。它沒有任何區別。 –

+0

你能告訴我們你的notifyPropertyChanged函數嗎? – Kulvir

1

我認爲這是指在你的DataTrigger枚舉一個更好的方式:

<Style x:Key="buttonImageStyle" TargetType="{x:Type Image}"> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding Path=buttonStyle}"> 
       <DataTrigger.Value> 
        <local:ButtonStyle>Text</local:ButtonStyle> 
       </DataTrigger.Value> 
       <Setter Property="Visibility" Value="Collapsed" /> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 

運行期間的資源變化的價值,這就是爲什麼你應該使用的,而不是靜態資源DynamicResource:

Style="{DynamicResource buttonImageStyle}" 
+0

表示枚舉的區別是語法糖,兩種形式都是等價的。至於使用{DynamicResource =} ...我希望它,但它沒有奏效。 –