在 DataTemplate 内部使用 TreeView 层次结构和 HierarchicalDataTemplate

问题描述 投票:0回答:1

我有一个使用

TreeView
的 WPF 应用程序,其中
TreeView
有多个针对不同类型的
HierarchicalDataTemplates
/
DataTemplates
,每个都包含一个
ContentControl
和特定的
Template
,如下所示:

TreeView
|- HierarchicalDataTemplate for Type a
|  |- ContentControl
|
|- DataTemplate for Type b
   |- ContentControl

类型

b
的构建如下:

b
|-integer c
|-object d

d
可以是从整数到字符串的任何内容,但它也可以是包含列表的类。在这种情况下,我想使用上述
d
内的
HierarchicalDataTemplate
显示
TreeView
列表。

有没有办法做到这一点,或者一旦我进入

TreeView
/
DataTemplate
/
ContentControl
,我就会失去与
Template
的层次结构的所有连接吗?

c# wpf treeview datatemplate hierarchicaldatatemplate
1个回答
1
投票

对于像这样的复杂场景,您可以实现自定义

DataTemplateSelector
。根据您的描述,我假设数据类型类似于
A
B
,具有
C
D
的属性:

public class A
{
}

public class B
{
   public B(int c, object d)
   {
      C = c;
      D = d;
   }

   public int C { get; }

   public object D { get; }
}

您可以为每种类型和目的创建自定义数据模板。对于

B
,当
DataTemplate
是集合时,会有一个
HierarchicalDataTemplate
和一个
D

<TreeView ItemsSource="{Binding MyItems}">
   <TreeView.ItemTemplateSelector>
      <local:CustomDataTemplateSelector/>
   </TreeView.ItemTemplateSelector>
   <TreeView.Resources>
      <DataTemplate x:Key="ATemplate"
                    DataType="{x:Type local:A}">
         <TextBlock Text="This is an A."/>
      </DataTemplate>
      <DataTemplate x:Key="BTemplate" DataType="{x:Type local:B}">
         <StackPanel>
            <TextBlock Text="{Binding C}"/>
            <TextBlock Text="{Binding D}"/>
         </StackPanel>
      </DataTemplate>
      <HierarchicalDataTemplate x:Key="BHierarchicalTemplate"
                                DataType="{x:Type local:B}"
                                ItemsSource="{Binding D}">
         <TextBlock Text="{Binding C}"/>
      </HierarchicalDataTemplate>
   </TreeView.Resources>
</TreeView>

需要使用

x:Key
来解析数据模板。在这种情况下,我们将检查某个项目是否属于 DataTemplateSelector
 类型并使用 
A
。如果是
ATemplate
,我们通过检查属性
B
来检查其模板是否需要分层。如果它是一个集合 - 或者更一般地说是一个
D
,我们使用分层模板。但是,请注意,像 
IEnumerable
这样的某些类型也是可枚举的,因此我们需要进行单独的检查。
string
是否为模板名称创建常量或从类型名称构建键或公开属性来分配数据模板取决于您的要求。

	

© www.soinside.com 2019 - 2024. All rights reserved.