首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >设置了“ItemTemplate”和“ItemTemplateSelector”;将忽略“ItemTemplateSelector”

设置了“ItemTemplate”和“ItemTemplateSelector”;将忽略“ItemTemplateSelector”
EN

Stack Overflow用户
提问于 2017-11-21 14:08:36
回答 1查看 890关注 0票数 1

this question之后,我还有一个关于TreeView的问题。

我已经拥有了一个带有TreeViewHierarchicalDataTemplate,在其中我可以更改HierarchicalDataTemplate of level2 (就像在问题和答案中解释的那样)。

我现在想要的是改变Treeview扩展器的外观。为此,我定义了一个名为ControlTemplatectForTreeViewItem,我使用它时如下所示:

代码语言:javascript
复制
<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,因此在第1级中,我使用了带有定义的ControlTemplate和正确的HierarchicalDataTemplateTreeViewItems

但是,它不能在Level2上工作,因为我有一个ItemTemplateSelector。在这个位置,我得到了一个错误:System.Windows.Data Error: 25 : Both 'ItemTemplate' and 'ItemTemplateSelector' are set; 'ItemTemplateSelector' will be ignored.

  • 我是否可以在保留ControlTemplate的同时,为TreeViewItem分配一个ItemTemplateSelector?甚至
  • 还有其他方法,我可以改变TreeView的扩展器的样式吗?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-21 15:07:25

你的TreeViewItem ControlTemplate坏了。它忽略数据模板选择器,因为您是ContentPresenter。这与导致调试输出流中(无害的)错误的原因类似:第2级模板从它们的祖先继承了一个ItemTemplateSelector,就像您在TreeView上设置一次ItemContainerStyle一样,它将由treeview的所有子程序继承,除非有一些干预的子模板显式地覆盖它。不需要设置不止一次。因为第2级模板继承ItemTemplateSelector并使用不同的属性覆盖它,所以会得到一个错误,但它是无害的。

我通过更改头部的ContentPresenter以匹配默认的TreeViewItem控件模板来修正控件模板:我删除了ContentContentTemplateContentStringFormat属性。对于所有这些内容,ContentPresenter都有默认行为,因此不需要显式地指定它。

代码语言:javascript
复制
<ContentPresenter 
    ContentSource="Header"
    Name="PART_Header"
    HorizontalAlignment="{TemplateBinding Control.HorizontalContentAlignment}"
    SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" 
    />

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

代码语言:javascript
复制
<HierarchicalDataTemplate 
    x:Key="Level2RedTemplate"
    ItemsSource="{Binding Value}"
    ItemTemplateSelector="{x:Null}"
    ItemTemplate="{StaticResource Level3Template}"
    >
    <Border Background="Red">
        <TextBlock Text="Level2"/>
    </Border>
</HierarchicalDataTemplate>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47415104

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档