TreeView HierarchicalDataTemplate 不适用 ItemContainerStyle
TreeView HierarchicalDataTemplate does not apply ItemContainerStyle
我尝试使用 TreeView 显示分层数据,我想为我的不同子类型设置不同的数据模板。
但问题是,我的风格没有得到应用。
也许这是一个非常简单的错误,但我真的没有找到它。
<TreeView ItemsSource="{Binding List}">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type local:Main}" ItemsSource="{Binding Children}">
<TextBlock Text="{Binding Property1}"/>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type local:Type2}">
<HierarchicalDataTemplate.ItemContainerStyle>
<Style TargetType="TreeViewItem">
<Setter Property="IsExpanded" Value="True"/>
</Style>
</HierarchicalDataTemplate.ItemContainerStyle>
<TextBlock Text="{Binding Property2}"/>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type local:Type3}">
<HierarchicalDataTemplate.ItemContainerStyle>
<Style TargetType="TreeViewItem">
<Setter Property="IsExpanded" Value="False"/>
</Style>
</HierarchicalDataTemplate.ItemContainerStyle>
</HierarchicalDataTemplate>
</TreeView.Resources>
</TreeView>
我可能遇到过类似的问题。如果 Main、Type2 和 Type3 是接口,XAML 中的选择将不起作用,我不得不使用 类。如果你想使用接口,你可以实现一个模板选择器。
好的,我知道出了什么问题。 HierarchicalDataTemplate.ItemContainerStyle 包含应用于存储当前节点的 children 的 ItemsContainer 的样式。试试这个作为实验,将您的样式更改为:
<HierarchicalDataTemplate.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="IsExpanded" Value="True" />
<Setter Property="Foreground" Value="Navy" />
</Style>
</HierarchicalDataTemplate.ItemContainerStyle>
您会注意到,您放置此样式的节点继续具有黑色前景,但所有 children 现在都具有海军蓝前景。
这有点违反直觉,但仔细想想,我想这是有道理的。因此,考虑到这一点,我认为最好的解决方案是将所有 TreeViewItems 的 IsExpanded 绑定到 VM 中的一个变量,然后根据那里的类型选择不同的值。
我尝试使用 TreeView 显示分层数据,我想为我的不同子类型设置不同的数据模板。
但问题是,我的风格没有得到应用。
也许这是一个非常简单的错误,但我真的没有找到它。
<TreeView ItemsSource="{Binding List}">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type local:Main}" ItemsSource="{Binding Children}">
<TextBlock Text="{Binding Property1}"/>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type local:Type2}">
<HierarchicalDataTemplate.ItemContainerStyle>
<Style TargetType="TreeViewItem">
<Setter Property="IsExpanded" Value="True"/>
</Style>
</HierarchicalDataTemplate.ItemContainerStyle>
<TextBlock Text="{Binding Property2}"/>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type local:Type3}">
<HierarchicalDataTemplate.ItemContainerStyle>
<Style TargetType="TreeViewItem">
<Setter Property="IsExpanded" Value="False"/>
</Style>
</HierarchicalDataTemplate.ItemContainerStyle>
</HierarchicalDataTemplate>
</TreeView.Resources>
</TreeView>
我可能遇到过类似的问题。如果 Main、Type2 和 Type3 是接口,XAML 中的选择将不起作用,我不得不使用 类。如果你想使用接口,你可以实现一个模板选择器。
好的,我知道出了什么问题。 HierarchicalDataTemplate.ItemContainerStyle 包含应用于存储当前节点的 children 的 ItemsContainer 的样式。试试这个作为实验,将您的样式更改为:
<HierarchicalDataTemplate.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="IsExpanded" Value="True" />
<Setter Property="Foreground" Value="Navy" />
</Style>
</HierarchicalDataTemplate.ItemContainerStyle>
您会注意到,您放置此样式的节点继续具有黑色前景,但所有 children 现在都具有海军蓝前景。
这有点违反直觉,但仔细想想,我想这是有道理的。因此,考虑到这一点,我认为最好的解决方案是将所有 TreeViewItems 的 IsExpanded 绑定到 VM 中的一个变量,然后根据那里的类型选择不同的值。