Изменение фона TreeViewItem на основе прикрепленного свойства

Я пытаюсь изменить фон TreeViewItems в TreeView на основе свойства (логического), прикрепленного к TreeViewItems. Я пробовал это:

    <local:BooleanToBrushConverter x:Key="BooleanToBrushConverter" 
                                   TrueBrush="Yellow" FalseBrush="Transparent"/>


    <local:TreeViewEx ItemsSource="{Binding Items}">

        <TreeView.ItemContainerStyle>
            <Style TargetType="{x:Type TreeViewItem}">
                <Setter Property="IsExpanded" Value="True"/>
                <Setter Property="Background" Value="{Binding Path=(local:TreeViewItemExtensions.Selected), 
                                                              RelativeSource={RelativeSource Self},
                                                              Converter={StaticResource BooleanToBrushConverter}}"/>
        <TreeView.Resources>
            <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Transparent"/>
            <SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="Green"/>
        </TreeView.Resources>

        ...

    </local:TreeViewEx>

Запустил приложение, но хотя я (программно) установил для свойства (Selected, не путать с IsSelected) значение true в «Child» TreeViewItem, фон не был установлен

Я посмотрел со Snoop и обнаружил, что у него нет желтого фона, как должен (конвертер срабатывает и возвращается правильно):

введите описание изображения здесь

Однако, взглянув на Snoop, можно увидеть, что Желтая кисть была применена к этому TreeViewItem:

введите описание изображения здесь

Однако, если я вручную установил фон для родительской Stackpanel ([016] в Snoop), он отражает это значение. Но по стилю не дойду ...

Любые идеи?


ОБНОВЛЕНИЕ: похоже, что у выбранного в данный момент элемента есть какой-то стиль, который нужно как-то исправить ...


person Andrei Rînea    schedule 22.01.2012    source источник


Ответы (1)


Проблема возникает из-за того, что TreeView.ItemContainerStyle применяется только к корневому элементу. Если вы замените TreeView.ItemContainerStyle стилем по умолчанию для TreeViewItem в TreeView.Resources, вы получите стиль, который применяется ко всем элементам (в этом TreeView):

    <TreeView>
        <TreeView.Resources>
            <!-- default style instead of ItemContainerStyle -->
            <Style TargetType="TreeViewItem">
                <Setter Property="Background"
                        Value="{Binding Path=(local:TreeViewItemExtensions.Selected), 
                                        RelativeSource={RelativeSource Self}, 
                                        Converter={StaticResource BooleanToBrushConverter}}"/>
            </Style>
        </TreeView.Resources>
        <TreeViewItem Header="Root" IsExpanded="True">
            <TreeViewItem Header="Child"/>
            <TreeViewItem Header="Child" Name="testChild"/>
            <TreeViewItem Header="Child"/>
        </TreeViewItem>
    </TreeView>

Теперь установка вложенного свойства Selected работает:

TreeViewItemExtensions.SetSelected(testChild, true);
person Clemens    schedule 22.01.2012