我有一个使用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
可以是从整数到字符串的任何值,但也可以是包含列表的类。在这种情况下,我想使用上面描述的TreeView
中的HierarchicalDataTemplate
显示d
的列表。
有没有办法做到这一点,或者我一进入DataTemplate
/ContentControl
/Template
就失去了与TreeView
层次结构的所有连接?
1条答案
按热度按时间8ehkhllq1#
对于像这样的复杂场景,您可以实现自定义的
DataTemplateSelector
。根据您的描述,我假设A
和B
的数据类型如下,并具有C
和D
的属性:您可以为每种类型和用途创建自定义数据模板。对于
B
,当D
是一个集合时,将有一个DataTemplate
用于常规类型,一个HierarchicalDataTemplate
用于:需要
x:Key
来使用DataTemplateSelector
解析数据模板。在这种情况下,我们将检查一个项目是否是A
类型,并使用ATemplate
。如果它是B
,我们通过检查属性D
来检查它的模板是否需要分层。如果它是一个集合,或者更一般地说是IEnumerable
,我们使用分层模板。但是,要注意,有些类型(如string
)也是可编译的,因此我们需要进行单独的检查。是为模板名称创建常量,还是从类型名称构建键,还是公开属性来分配数据模板,这取决于您的要求。