'ItemTemplate'和'ItemTemplateSelector'都已设置; 'ItemTemplateSelector'将被忽略

时间:2017-11-21 14:08:36

标签: wpf treeview controltemplate hierarchicaldatatemplate itemtemplateselector

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

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

我现在想要的是改变Treeview扩展器的外观。为此,我定义了一个名为ControlTemplate的{​​{1}},我这样使用它:

ctForTreeViewItem

这适用于Level1,因此在第1级,我<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> 使用定义的TreeViewItems和正确的ControlTemplate

但是,它在Level2上不起作用,我有HierarchicalDataTemplate。在这个位置,我收到此错误:ItemTemplateSelector

  • 有没有办法,我可以System.Windows.Data Error: 25 : Both 'ItemTemplate' and 'ItemTemplateSelector' are set; 'ItemTemplateSelector' will be ignored.分配ControlTemplate,同时保留TreeViewItem?甚至

  • 还有其他方法,我可以改变ItemTemplateSelector扩展器的样式吗?

1 个答案:

答案 0 :(得分:1)

您的TreeViewItem ControlTemplate已损坏。它会忽略数据模板选择器,因为您explicitly override that by setting ContentTemplate on the ContentPresenter。这类似于导致调试输出流中的(无害)错误的原因:2级模板从其祖先继承ItemTemplateSelector,就像在ItemContainerStyle上设置TreeView一样{1}},它将由树视图的所有子项继承,除非一些介入的子项明确地覆盖它。无需多次设置。因为2级模板继承ItemTemplateSelector并使用不同的属性覆盖它,所以会出错,但它是无害的。

我修改了控件模板,方法是更改​​Header的ContentPresenter以匹配默认的TreeViewItem控件模板:我删除了ContentContentTemplateContentStringFormat属性。 ContentPresenter具有所有内容的默认行为,因此您无需明确指定它。

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

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

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