Итак, я работал над сложной древовидной структурой, используя привязку WPF. Ни один из сценариев, которые я нашел в Интернете, не смог решить проблему, но они приблизились.
Итак, у меня есть три объекта, которые выглядят примерно так:
public class A
{
public string Name {get; set;}
public List<A> ListOfA {get; set;}
public List<B> ListOfB {get; set;}
}
public class B
{
public string Name {get; set;}
public List<C> ListOfC {get; set;}
public List<D> ListOfD {get; set;}
}
public class C
{
public string Name {get; set;}
public List<D> {get; set;}
}
public class D
{
public string Name{get; set;}
}
Следует отметить, что ListOfA, ListOfB, ListOfC и ListOfD могут быть пустыми. Я знаю, что это кажется запутанным, но для моего приложения вполне понятно, почему я так поступлю.
Ниже приведен пример того, как может выглядеть древовидное представление
A - Name
| - A - Name
| - B - Name
| - D - Name
| - D - Name
| - D - Name
| - A - Name
| - B - Name
| - C - Name
| - D - Name
| - D - Name
| - A - Name
| - A - Name
| - A - Name
| - A - Name
| - A - Name
Итак, я выяснил, как отформатировать древовидную структуру A и B, как показано ниже в классе A.
public IList Children
{
get
{
return new CompositeCollection()
{
new CollectionContainer() { Collection = ListOfA },
new CollectionContainer() { Collection = ListOfB }
};
}
}
}
Что я получил от этого вопроса: WPF Treeview Databinding Hierarchal Data со смешанными типами
Ниже приведен мой код XAML, заменяющий реальные объекты A / B / C. Примечание ListOfA является членом модели представления.
<TreeView ItemsSource = "{Binding Children}">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type local:A}"
ItemsSource="{Binding Children}">
<TextBlock Text="{Binding}"/>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type local:B}"
ItemsSource="{Binding Children}">
<TextBlock Text="{Binding Name}"/>
</HierarchicalDataTemplate>
</TreeView.Resources>
</TreeView>
Это прекрасно работает, но я не могу понять, как функционально добавить D в это древовидное представление. Я смог сделать это, добавив элемент древовидного представления с вложенным древовидным представлением, содержащим ListOfD внутри HierarchicalDataTemplate для типа B, но я знаю, что это не очень хороший способ сделать это.
Я также попытался добавить что-то вроде:
<DataTemplate DataType={x:Type local:D>
<TextBlock Text={Binding Name}/>
</DataTemplate>
Но это не работает, я полагаю, потому что не у каждого потомка этого объекта 'Children' нет объекта типа D внутри него. Я также не уверен, как обращаться с объектом типа C, но сейчас я больше сосредоточен на D, и готов поспорить, что я знаю, как справиться с этим, как только я заставлю D работать в любом случае.
Я делаю это сложнее, чем нужно, или я на правильном пути, вкладывая вещи в шаблон иерархических данных?