Silverlight中的条件样式?

dea*_*vmc 15 c# silverlight controls templating

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

我遇到的问题是,当鼠标悬停时,每个链接的颜色都不同.一个红色,一个蓝色,一个绿色等.有没有一种方法来设置这些项目的样式而不牺牲使用数据模板的项目控件的动态?

luk*_*uke 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
}
Run Code Online (Sandbox Code Playgroud)

然后作为资源,你将定义你的两种风格......

    <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>
Run Code Online (Sandbox Code Playgroud)

然后你会像这样将它应用到你的对象......

<TextBlock Text="{Binding Description}"
           Margin="20,4,4,4"
           Style="{Binding IsConfirmed, Converter={StaticResource BoldTextConverter}}"></TextBlock>
Run Code Online (Sandbox Code Playgroud)

其中IsConfirmed是viewmodel上的布尔属性,如果IsConfirmed属性更改,这也将使样式保持同步.

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