15

虽然我对 silverlight 中的标准控件样式很好,但我最近开始使用更动态的方法来获取要在项目控件中显示的数据。我正在修改的控件之一是链接集合。

我遇到的问题是鼠标悬停时每个链接的颜色都不同。一个红色,一个蓝色,一个绿色等。有没有办法在不牺牲使用带有数据模板的项目控件的动态的情况下设置这些项目的样式?

4

1 回答 1

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属性更改,这也会使样式保持同步。

如果你想使用比布尔值更复杂的条件,你总是可以在转换器中创建一个对象字典到样式,然后让转换器进行查找,但我发现通常布尔值在大多数情况下都有效。

于 2010-06-13T23:56:55.493 回答