我的树视图可以简化为:
<TreeView ItemsSource="{Binding A}">
<TreeView.Resources>
<HierarchialDataTemplate DataType="{x:Type local:A}">
<!-- XAML to display objects of type A -->
</HierarchialDataTemplate>
<HierarchialDataTemplate DataType="{x:Type local:B}">
<!-- XAML to display objects of type B -->
</HierarchialDataTemplate>
<DataTemplate DataType="{x:Type local:C}">
<!-- XAML to display objects of type C -->
</DataTemplate>
</TreeView.Resources>
</TreeView>
效果很好。
现在,我有一个看似简单的要求,即向DataTemplates添加标题,例如:
我不能为我的生活弄清楚如何做到这一点,因为我只能使用HierarchicalDataTemplate
编辑每个单独项目的样式,我无法改变模板本身以显示静态标题(上面以粗体显示)。
任何帮助都会非常感激,我对WPF来说太可怕了。
答案 0 :(得分:0)
我认为使用TreeView
实现此目标的唯一方法是重新模板TreeViewItem
。以下是一个相当小的例子,你几乎肯定想要了解美貌。
<TreeView ItemsSource="{Binding DataSource}">
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TreeViewItem}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="10" />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<ToggleButton
Name="ExpandButton"
ClickMode="Press"
IsChecked="{Binding Path=IsExpanded, RelativeSource={RelativeSource TemplatedParent}}"
/>
<ContentPresenter
Grid.Column="1"
ContentSource="Header"
/>
<TextBlock
Name="Caption"
Grid.Column="1"
Grid.Row="1"
Text="List Caption"
/>
<ItemsPresenter
Name="Content"
Grid.Column="1"
Grid.Row="2"
/>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsExpanded" Value="False">
<Setter TargetName="Caption" Property="Visibility" Value="Collapsed" />
<Setter TargetName="Content" Property="Visibility" Value="Collapsed" />
</Trigger>
<Trigger Property="HasItems" Value="False">
<Setter TargetName="ExpandButton" Property="Visibility" Value="Collapsed" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</TreeView.ItemContainerStyle>
</TreeView>
注意:像这样模板TreeViewItem
只会将标题添加到子项。如果您希望根项目也有字幕,那么您可以以类似的方式重新模板TreeView
,或者只是将某些内容置于TreeView
之上。