2010-06-13 99 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