【问题标题】:TreeView with HierarchicalDataTemplates Needing Headers带有需要标头的 HierarchicalDataTemplates 的 TreeView
【发布时间】:2015-12-08 21:58:11
【问题描述】:

我有一个可以简化为的树视图:

<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 中简直是神来之笔。

【问题讨论】:

  • 代替TreeView,你可以看看用DataGridRowDetailsTemplate实现的功能。
  • 我想你想设置ItemsPanel

标签: c# wpf treeview hierarchicaldatatemplate


【解决方案1】:

我认为使用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 本身上方放置一些内容。

【讨论】:

    猜你喜欢
    • 2010-10-17
    • 1970-01-01
    • 2012-05-10
    • 1970-01-01
    • 1970-01-01
    • 2014-07-20
    • 2022-10-26
    • 2014-03-13
    • 1970-01-01
    相关资源
    最近更新 更多