Условный стиль в Silverlight?

В то время как я в порядке со стандартным стилем управления в silverlight, я недавно начал использовать более динамичные методы выборки данных, которые будут отображаться в элементах элементов управления. Один из элементов управления, который я перерабатываю, представляет собой набор ссылок.

Проблема, с которой я сталкиваюсь, заключается в том, что каждая ссылка окрашивается по-разному, когда мышь. Один красный, один синий, один зеленый и т.д. Есть ли способ стилизовать эти элементы, не жертвуя динамикой использования элемента управления с шаблоном данных?

Ответы

Ответ 1

Я сделал это, используя простой конвертер по свойству модели представления, например, скажем, что у вас есть логическое свойство, которым вы хотели управлять стилем, который вы могли бы сделать.

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 изменится.

Если вы хотите использовать более сложное условие, чем логическое, вы всегда можете создать словарь объектов для стилей в вашем конвертере, а затем сделать конвертер для поиска, но я обнаружил, что обычно в большинстве случаев работают boolean.