我有一个使用
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
的层次结构的所有连接吗?
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
是否为模板名称创建常量或从类型名称构建键或公开属性来分配数据模板取决于您的要求。