Установлены как «ItemTemplate», так и «ItemTemplateSelector»; 'ItemTemplateSelector' будет проигнорирован

После этого вопроса у меня есть еще один вопрос о TreeView.

У меня уже есть TreeViewс HierarchicalDataTemplate, в котором я могу изменить HierarchicalDataTemplate уровня 2 (как описано в вопросе и ответе).

Что я хочу сейчас, так это изменить внешний вид расширителя Treeview. Для этого я определил ControlTemplate с именем ctForTreeViewItem и использую его следующим образом:

<Window.Resources>
    <ControlTemplate x:Key="ctForTreeViewItem"
                     TargetType="{x:Type TreeViewItem}">
        <Expander IsExpanded="True"
                  Background="Grey"
                  BorderBrush="Transparent"
                  Foreground="White"
                  BorderThickness="1,1,1,3">
            <Expander.Header>
                <Border BorderThickness="{TemplateBinding Border.BorderThickness}"
                        Padding="{TemplateBinding Control.Padding}"
                        BorderBrush="{TemplateBinding Border.BorderBrush}"
                        Background="{TemplateBinding Panel.Background}"
                        Name="Bd"
                        SnapsToDevicePixels="True"
                        Grid.Column="1">
                    <ContentPresenter Content="{TemplateBinding HeaderedContentControl.Header}"
                                      ContentTemplate="{TemplateBinding HeaderedContentControl.HeaderTemplate}"
                                      ContentStringFormat="{TemplateBinding HeaderedItemsControl.HeaderStringFormat}"
                                      ContentSource="Header"
                                      Name="PART_Header"
                                      HorizontalAlignment="{TemplateBinding Control.HorizontalContentAlignment}"
                                      SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" />
                </Border>
            </Expander.Header>

            <Expander.Content>
                <ItemsPresenter x:Name="ItemsHost" />
            </Expander.Content>

        </Expander>
    </ControlTemplate>

    <DataTemplate x:Key="Level3Template">
        <Border Background="LightBlue">
            <TextBlock Text="Level3"/>
        </Border>
    </DataTemplate>

    <HierarchicalDataTemplate x:Key="Level2RedTemplate"
                          ItemsSource="{Binding Value}"
                          ItemTemplate="{StaticResource Level3Template}">
        <Border Background="Red">
            <TextBlock Text="Level2"/>
        </Border>
    </HierarchicalDataTemplate>

    <HierarchicalDataTemplate x:Key="Level2YellowTemplate"
                          ItemsSource="{Binding Value}"
                          ItemTemplate="{StaticResource Level3Template}">
        <Border Background="Yellow">
            <TextBlock Text="Level2"/>
    </HierarchicalDataTemplate>

    <HierarchicalDataTemplate x:Key="Level1Template" 
                          ItemsSource="{Binding Value}"
                          ItemTemplateSelector="{StaticResource MySelector}">

        <HierarchicalDataTemplate.ItemContainerStyle>
            <Style TargetType="TreeViewItem">
                <Setter Property="Template"
                        Value="{StaticResource ctForTreeViewItem}" />
            </Style>
        </HierarchicalDataTemplate.ItemContainerStyle>

        <Border Background="Green">
            <TextBlock Text="Level1"/>
        </Border>
    </HierarchicalDataTemplate>
</Window.Resources>

<TreeView Grid.Row="1"
          Name="tv"
          ItemsSource="{Binding Items}"
          ItemTemplate="{StaticResource Level1Template}">
    <TreeView.ItemContainerStyle>
        <Style TargetType="TreeViewItem">
            <Setter Property="Template"
                    Value="{StaticResource ctForTreeViewItem}" />
        </Style>
    </TreeView.ItemContainerStyle>
</TreeView>

Это работает для уровня 1, как и ожидалось, поэтому на уровне 1 у меня есть TreeViewItems с определенным ControlTemplate и правильным HierarchicalDataTemplate.

Однако это не работает на уровне 2, где у меня есть ItemTemplateSelector. В этой позиции я получаю эту ошибку: System.Windows.Data Error: 25 : Both 'ItemTemplate' and 'ItemTemplateSelector' are set; 'ItemTemplateSelector' will be ignored.

  • Есть ли способ, которым я могу назначить ControlTemplate для TreeViewItems, сохраняя при этом ItemTemplateSelector? Или даже

  • Есть ли другой способ изменить стиль расширителя TreeView?


person Yvonnila    schedule 21.11.2017    source источник
comment
Вы пытались установить ItemTemplateSelector в стиле TreeViewItem в своем HierarchicalDataTemplate?   -  person 15ee8f99-57ff-4f92-890c-b56153    schedule 21.11.2017
comment
И что это значит? значит ли это, что я не могу использовать их одновременно (как я объяснил выше)?   -  person Yvonnila    schedule 21.11.2017
comment
@EdPlunkett Да, я также переместил ItemTemplateSelector на уровень 1. У меня была такая же ошибка, как только я определил Template для ItemContainerStyle из TreeView.   -  person Yvonnila    schedule 21.11.2017
comment
Да, естественно, вы не можете установить одновременно Itemtemplate и ItemtemplateSelector. Это не имеет ничего общего с ItemContainerStyle. Не устанавливайте ItemTemplate. Используйте ItemTemplateSelector, чтобы выбрать шаблон элемента. Кроме того, если у вас возникли проблемы с уровнем 2, что такое уровень 2? Можем ли мы увидеть его код?   -  person 15ee8f99-57ff-4f92-890c-b56153    schedule 21.11.2017
comment
@EdPlunkett, вы правы, я хотел предотвратить раздувание вопроса, повторив свой предыдущий вопрос. Теперь я отредактировал вопрос.   -  person Yvonnila    schedule 21.11.2017
comment
Почему вы везде устанавливаете ItemContainerStyle? Вам нужно сделать это только один раз, в TreeView, если вы не хотите начать придавать своим дочерним элементам TreeViewItems другой стиль на каком-то уровне. Я вижу только один шаблон управления treeviewitem; вы опустили второй для краткости?   -  person 15ee8f99-57ff-4f92-890c-b56153    schedule 21.11.2017
comment
@EdPlunkett и я не устанавливаем Itemtemplate и ItemtemplateSelector одновременно. Я установил ControlTemplate и ItemtemplateSelector одновременно. По крайней мере, это мое намерение.   -  person Yvonnila    schedule 21.11.2017
comment
Да, я действительно хотел, чтобы уровень 1 был расширен, а уровень 2 свернут. Я удалил их сейчас: у меня есть ControlTemplate для моего TreeView, ItemTemplateSelector для Level1 и No ItemContainerStyle для уровней. И у меня все еще та же ошибка.   -  person Yvonnila    schedule 21.11.2017
comment
Вы тоже используете ControlTemplate и не получаете ошибок?   -  person Yvonnila    schedule 21.11.2017
comment
Смотрите обновление к моему ответу. Все было из-за проблем в вашем ControlTemplate.   -  person 15ee8f99-57ff-4f92-890c-b56153    schedule 21.11.2017


Ответы (1)


Ваш шаблон управления TreeViewItem не работает. Он игнорирует селектор шаблона данных, поскольку вы явно переопределить это, установив ContentTemplate в ContentPresenter. Это похоже на то, что вызывает (безвредные) ошибки в вашем потоке вывода отладки: шаблоны уровня 2 наследуют ItemTemplateSelector от своих предков, точно так же, если вы установите ItemContainerStyle один раз в TreeView, он будет унаследован всеми дочерними элементами. древовидного представления, если какой-либо промежуточный дочерний элемент явно не переопределяет его. Нет необходимости устанавливать его более одного раза. Поскольку шаблоны уровня 2 наследуют ItemTemplateSelector и переопределяют его другим свойством, вы получаете сообщение об ошибке, но это безвредно.

Я исправил шаблон элемента управления, изменив ContentPresenter для заголовка, чтобы он соответствовал шаблону элемента управления TreeViewItem по умолчанию: я удалил атрибуты Content, ContentTemplate и ContentStringFormat. ContentPresenter имеет поведение по умолчанию для всего этого, поэтому вам не нужно указывать его явно.

<ContentPresenter 
    ContentSource="Header"
    Name="PART_Header"
    HorizontalAlignment="{TemplateBinding Control.HorizontalContentAlignment}"
    SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" 
    />

Ошибки выбора шаблона/шаблона безвредны, но я смог их отключить, явно задав ItemTemplateSelector значение null в шаблонах иерархических данных уровня 2:

<HierarchicalDataTemplate 
    x:Key="Level2RedTemplate"
    ItemsSource="{Binding Value}"
    ItemTemplateSelector="{x:Null}"
    ItemTemplate="{StaticResource Level3Template}"
    >
    <Border Background="Red">
        <TextBlock Text="Level2"/>
    </Border>
</HierarchicalDataTemplate>
person 15ee8f99-57ff-4f92-890c-b56153    schedule 21.11.2017