2013-01-07 193 views
1

我在WPF自定義控件基於一個屬性,它改變了他的樣子:WPF自定義控件「風格模式」

...

<Grid> 
    <Rectangle Fill="[Something]" /> 
</Grid> 

在代碼中,我的財產警報等級,當警報等級是大於5我想填充爲紅色,否則爲藍色。 我該怎麼做。 (我不希望被曝光的填充屬性)

TNX

+0

您可以實現它每次更改檢查值,並從那裏走時INotifyPropertyChanged接口。 http://msdn.microsoft.com/en-us/library/ms743695.aspx – Botonomous

+2

您將需要一個ValueConverter(的IValueConverter)來做到這一點。如果您在本網站上搜索IValueConverter,會有很多結果來顯示應該如何實施。 – Stewbob

回答

2

既然你在一個不平等的基礎填充值,你可以這樣做一對夫婦的方式。

推薦的方法可能是使用一個轉換器上的結合,使之成爲一個布爾值。然後使用數據觸發設置基礎上的值是否是真還是假,像這樣的填充值:

<Rectangle> 
    <Rectangle.Style> 
    <Style TargetType="Rectangle"> 
     <Style.Triggers> 
     <DataTrigger Binding="{Binding AlarmLevel, Converter={StaticResource AlarmLevelConverter}}" Value="True"> 
      <Setter Property="Fill"> 
      <Setter.Value> 
       <SolidColorBrush Color="Red" /> 
      </Setter.Value> 
      </Setter> 
     </DataTrigger> 
     <DataTrigger Binding="{Binding AlarmLevel, Converter={StaticResource AlarmLevelConverter}}" Value="False"> 
      <Setter Property="Fill"> 
      <Setter.Value> 
       <SolidColorBrush Color="Black" /> 
      </Setter.Value> 
      </Setter> 
     </DataTrigger> 
     </Style.Triggers> 
    </Style> 
    </Rectangle.Style> 
</Rectangle> 

你的轉換可能看起來像(也許更多的異常處理):

public class AlarmLevelConverter: IValueConverter { 

    public object Convert(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture) { 
     return ((int)(value) > 5); 
    } 

    public object ConvertBack(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture) { 
     throw new NotSupportedException(); 
    } 
    } 

不要忘記你需要一個參考轉換器類添加爲一個資源上的用戶控件:

如果你想放棄的轉換器的方法,你也可以創建你的數據上下文一個「助手」布爾屬性稱爲像「IsAlarming」。它看起來像這樣:

public bool IsAlarming { 
    get { return AlarmLevel > 5; } 
} 

然後,您會將您的數據觸發器綁定到IsAlarming而不是AlarmLevel。 這是不推薦,但因爲它不是純MVVM。

+0

這不是真的,後者'不是推薦的,它不是純粹的MVVM'。這正是視圖模型的目的 - 包含可以綁定到的屬性。在純MVVM中,你永遠不需要轉換器,因爲所有的東西都已經存在於虛擬機中。從某種意義上說,視圖模型是這種模式下的轉換器,因爲它們將模型數據轉換爲表示數據。 *這是推薦的做事方式。 – pbalaga