虽然我对Silverlight中的标准控件样式很好,但我最近开始使用更多动态方法来获取要在项目控件中显示的数据。我正在重做的控件之一是链接集合。
我遇到的问题是当鼠标悬停时,每个链接的颜色都不同。一个红色,一个蓝色,一个绿色等。有没有办法设置这些项目的样式而不牺牲使用数据模板的项目控件的动态?
答案 0 :(得分: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是viewmodel上的布尔属性,如果IsConfirmed
属性发生更改,这也会使样式保持同步。
如果你想使用比布尔更复杂的条件,你总是可以在转换器中创建一个对象字典到样式,然后让转换器进行查找,但我发现在大多数情况下通常使用布尔值。 / p>