2010-06-13 149 views
15

雖然我很好地使用Silverlight中的標準控件樣式,但我最近開始使用更多動態方法來獲取要在項目控件中顯示的數據。我正在重組的一個控件是鏈接的集合。Silverlight中的條件樣式?

我遇到的問題是每個鏈接被塗上不同的顏色。一個紅色,一個藍色,一個綠色等。有沒有一種方法來設計這些項目而不犧牲使用數據模板的項目控制的動態?

回答

24

我已經在視圖模型的屬性上使用了一個簡單的轉換器,例如讓我們說你有一個布爾屬性,你想控制一個樣式,你可以這樣做。

public class BoolToStyleConverter : IValueConverter 
{ 
    public Style TrueStyle{ get; set; } 
    public Style FalseStyle{ get; set; } 
    #region IValueConverter Members 

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return ((bool)value) ? TrueStyle : FalseStyle; 
    } 

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

    #endregion 
} 

然後作爲一種資源,你會定義兩種風格...

<common:BoolToStyleConverter x:Key="BoldTextConverter"> 
     <common:BoolToStyleConverter.TrueStyle> 
      <Style TargetType="TextBlock"> 
       <Setter Property="FontWeight" 
         Value="Bold"></Setter> 
      </Style> 
     </common:BoolToStyleConverter.TrueStyle> 
     <common:BoolToStyleConverter.FalseStyle> 
      <Style TargetType="TextBlock"> 
       <Setter Property="FontWeight" 
         Value="Normal"></Setter> 
      </Style> 
     </common:BoolToStyleConverter.FalseStyle> 
    </common:BoolToStyleConverter> 

那麼你將它應用到你的對象是這樣的...

<TextBlock Text="{Binding Description}" 
      Margin="20,4,4,4" 
      Style="{Binding IsConfirmed, Converter={StaticResource BoldTextConverter}}"></TextBlock> 

哪裏IsConfirmed是視圖模型上的一個布爾屬性,如果IsConfirmed屬性發生變化,這也會使樣式保持同步。

如果你想使用比布爾值更復雜的條件,你總是可以在你的轉換器中創建一個對象樣式字典,然後讓轉換器進行查找,但是我發現通常布爾值在大多數情況下工作。

+0

完美無缺,歡呼! – deanvmc 2010-06-14 10:35:01