TreeView与HierarchicalDataTemplates需要标题

时间:2015-12-08 21:58:11

标签: c# wpf treeview hierarchicaldatatemplate

我的树视图可以简化为:

<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添加标题,例如:

enter image description here

我不能为我的生活弄清楚如何做到这一点,因为我只能使用HierarchicalDataTemplate编辑每个单独项目的样式,我无法改变模板本身以显示静态标题(上面以粗体显示)。

任何帮助都会非常感激,我对WPF来说太可怕了。

1 个答案:

答案 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之上。