Изменить фон TreeViewItem на основе присоединенного свойства - PullRequest
0 голосов
/ 22 января 2012

Я пытаюсь изменить фон 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>

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

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

enter image description here

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

enter image description here

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

Есть идеи?


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

1 Ответ

2 голосов
/ 22 января 2012

Проблема связана с тем, что 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...