1

这个问题之后,我还有另一个问题TreeView

我已经拥有的是TreeViewwith HierarchicalDataTemplate,我可以在其中更改HierarchicalDataTemplatelevel2 (如问题和答案中所述)。

我现在想要的是改变扩展器的外观Treeview。为此,我定义了一个ControlTemplatenamed 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>

正如预期的那样,这适用于 Level1,所以在 Level 1 上,我TreeViewItems使用了 definedControlTemplate和 Correct HierarchicalDataTemplate

但是,它不适用于 Level2,我有一个ItemTemplateSelector. 在这个位置,我得到这个错误:System.Windows.Data Error: 25 : Both 'ItemTemplate' and 'ItemTemplateSelector' are set; 'ItemTemplateSelector' will be ignored.

  • 有什么办法,我可以将 a 分配ControlTemplateTreeViewItems,同时保留ItemTemplateSelector?甚至

  • 有没有其他方法可以改变扩展器的样式TreeView

4

1 回答 1

1

您的 TreeViewItem ControlTemplate 已损坏。它忽略数据模板选择器,因为您通过ContentTemplateContentPresenter. 这也类似于在调试输出流中导致(无害)错误的原因: 2 级模板ItemTemplateSelector从其祖先继承 an ,就像如果您ItemContainerStyle在 上设置一次TreeView,它将被树视图的所有子级继承除非某个干预的孩子明确地覆盖它。无需多次设置。因为 2 级模板继承ItemTemplateSelector并使用不同的属性覆盖它,所以您会得到一个错误,但它是无害的。

我通过更改 Header 的 ContentPresenter 以匹配默认的 TreeViewItem 控件模板来修复控件模板:我删除了ContentContentTemplateContentStringFormat属性。所有这些ContentPresenter东西都有默认行为,所以你不需要明确指定它。

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

模板/模板选择器错误是无害的,但我能够通过ItemTemplateSelector在 2 级分层数据模板上显式设置为 null 来使它们静音:

<HierarchicalDataTemplate 
    x:Key="Level2RedTemplate"
    ItemsSource="{Binding Value}"
    ItemTemplateSelector="{x:Null}"
    ItemTemplate="{StaticResource Level3Template}"
    >
    <Border Background="Red">
        <TextBlock Text="Level2"/>
    </Border>
</HierarchicalDataTemplate>
于 2017-11-21T15:07:25.047 回答