Tenho uma aplicação WPF que utiliza um TreeView
, dentro dele TreeView
existem vários HierarchicalDataTemplates
/ DataTemplates
para diferentes tipos, cada um contendo um ContentControl
com um específico Template
, assim:
TreeView
|- HierarchicalDataTemplate for Type a
| |- ContentControl
|
|- DataTemplate for Type b
|- ContentControl
O tipo b
é construído assim:
b
|-integer c
|-object d
d
pode ser qualquer coisa, desde um inteiro até uma string, mas também pode ser uma classe contendo uma lista. Nesse caso, quero exibir a lista de d
uso HierarchicalDataTemplate
dentro do TreeView
descrito acima.
Existe uma maneira de fazer isso ou perco toda a conexão com a hierarquia do TreeView
assim que entro no DataTemplate
/ ContentControl
/ Template
?
Para cenários complexos como este, você pode implementar um arquivo
DataTemplateSelector
. Pela sua descrição, assumo tipos de dados como estes paraA
eB
, com propriedades paraC
eD
:Você pode criar modelos de dados personalizados para cada tipo e finalidade. Para
B
, haveria umDataTemplate
para os tipos regulares e umHierarchicalDataTemplate
para quandoD
é uma coleção:Os
x:Key
s são necessários para resolver os modelos de dados usando oDataTemplateSelector
. Nesse caso, verificaríamos se um item é do tipoA
e usaríamos oATemplate
. Se forB
, verificamos se seu template precisa ser hierárquico ou não inspecionando a propriedadeD
. Se for uma coleção - ou em termos mais gerais umIEnumerable
, usamos o modelo hierárquico. No entanto, esteja ciente de que alguns tipos comostring
também são enumeráveis, portanto, precisamos fazer uma verificação separada.Se você criar constantes para os nomes de modelo ou construir as chaves dos nomes de tipo ou expor propriedades para atribuir os modelos de dados, depende de seus requisitos.