Обновить стиль элемента на основе пользовательской логики - PullRequest
2 голосов
/ 19 апреля 2011

Цель - установить стиль элемента в виде дерева.Выбор стиля зависит от свойства предмета.Я пробовал два метода:

  1. Переключить стиль элемента из триггера в TreeView.ItemTemplate.Проблема в том, что вы не можете назначить стиль из другого стиля.

  2. Переключение стиля элемента из ItemContainerStyleSelector.Проблема в том, что если свойство элемента обновляется (после инициализации формы), стиль не обновляется.(потому что StyleSelector.SelectStyle не срабатывает).

1 Ответ

3 голосов
/ 19 апреля 2011

Вы можете привязать свойство Style к изменяющемуся свойству вашего объекта и затем использовать ValueConverter для возврата правильного стиля, например, когда свойство является логическим:

public class StyleSelectionConverter : IValueConverter
{
    public Style OnStyle { get; set; }
    public Style OffStyle { get; set; }

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        bool input = (bool)value;
        if (input)
        {
            return OnStyle;
        }
        else
        {
            return OffStyle;
        }
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

Пример использования:

<ListView.Resources>
    <Style x:Key="OnStyle" TargetType="{x:Type TextBlock}">
        <Setter Property="Background" Value="LightGreen"/>
        <Setter Property="Foreground" Value="Green"/>
    </Style>
    <Style x:Key="OffStyle" TargetType="{x:Type TextBlock}">
        <Setter Property="Background" Value="Pink"/>
        <Setter Property="Foreground" Value="DarkRed"/>
    </Style>
    <local:StyleSelectionConverter x:Key="StyleSelectionConverter"
                                   OnStyle="{StaticResource OnStyle}"
                                   OffStyle="{StaticResource OffStyle}"/>
</ListView.Resources>
...
<GridViewColumn Header="Is Active">
    <GridViewColumn.CellTemplate>
        <DataTemplate>
            <DataTemplate.Resources>
            </DataTemplate.Resources>
            <TextBlock Style="{Binding IsActive, Converter={StaticResource StyleSelectionConverter}}"
                       Text="{Binding IsActive}"/>
        </DataTemplate>
    </GridViewColumn.CellTemplate>
</GridViewColumn>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...