在this question之后,我还有一个关于TreeView的问题。
我已经拥有了一个带有TreeView的HierarchicalDataTemplate,在其中我可以更改HierarchicalDataTemplate of level2 (就像在问题和答案中解释的那样)。
我现在想要的是改变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>这与预期的一样适用于Level1,因此在第1级中,我使用了带有定义的ControlTemplate和正确的HierarchicalDataTemplate的TreeViewItems。
但是,它不能在Level2上工作,因为我有一个ItemTemplateSelector。在这个位置,我得到了一个错误:System.Windows.Data Error: 25 : Both 'ItemTemplate' and 'ItemTemplateSelector' are set; 'ItemTemplateSelector' will be ignored.
ControlTemplate的同时,为TreeViewItem分配一个ItemTemplateSelector?甚至TreeView的扩展器的样式吗?发布于 2017-11-21 15:07:25
你的TreeViewItem ControlTemplate坏了。它忽略数据模板选择器,因为您是ContentPresenter。这与导致调试输出流中(无害的)错误的原因类似:第2级模板从它们的祖先继承了一个ItemTemplateSelector,就像您在TreeView上设置一次ItemContainerStyle一样,它将由treeview的所有子程序继承,除非有一些干预的子模板显式地覆盖它。不需要设置不止一次。因为第2级模板继承ItemTemplateSelector并使用不同的属性覆盖它,所以会得到一个错误,但它是无害的。
我通过更改头部的ContentPresenter以匹配默认的TreeViewItem控件模板来修正控件模板:我删除了Content、ContentTemplate和ContentStringFormat属性。对于所有这些内容,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>https://stackoverflow.com/questions/47415104
复制相似问题