大多数发现(迄今为止)关于使用WPF和MVVM模式的文章,将TreeView绑定到相同元素的树,例如http://www.codeproject.com/Articles/26288/Simplifying-the-WPF-TreeView-by-Using-the-ViewMode
在这些教程中,只有一个类,它包含相同类型的子类,例如class" person"有父母和孩子。 TreeView使用HierarchicalDataTemplate绑定到单个类。
如果有一些选择构建树的不同类,该怎么办?作为一个例子考虑这样的xml:
<a x=1>
<b x=2>
<c x=3 />
<c x=3 />
</b>
</a>
所以每个xml元素都被包装到一个不同的类中:类A,B和C.
如何正确编写XAML以绑定它们?
为了显示XAML以下的前2层适合:
<TreeView ItemsSource="{Binding As}">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Bs}">
<TreeViewItem>
<TreeViewItem.Header>
<TextBlock Text="{Binding x}" />
</TreeViewItem.Header>
</TreeViewItem>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
但如何包含第3层,即C?
答案 0 :(得分:0)
在WPF中的单个集合中显示不同的数据类型时,我们使用DataTemplate
定义每种类型的外观。 但是我们只能应用一个DataTemplate
我听到你大喊......如果我们不指定x:Key
值,我们就是别&#39;吨。因此,解决方案很简单......为每种数据类型定义DataTemplate
,只需不要在其中任何一种上设置x:Key
值 - 这样,框架将隐含地将它们应用于单个项目。
<DataTemplate DataType="{x:Type SomePrefix:SomeType}">
...
</DataTemplate>
...
<DataTemplate DataType="{x:Type SomePrefix:AnotherType}">
...
</DataTemplate>
解决方案的最后一部分是确保所有数据类型都扩展了您需要创建的基类:
public class SomeType : BaseDataType { ... }
...
public class AnotherType: BaseDataType { ... }
现在,您可以将此BaseDataType
类型的集合数据绑定到TreeView
,并将其填充到扩展基类的任何类中:
public ObservableCollection<BaseDataType> Items { get; set; }
...
Items.Add(new SomeType());
Items.Add(new AnotherType());
...
<TreeView ItemsSource="{Binding Items}" ... />
答案 1 :(得分:0)
解决方案是按层次结构包含HierarchicalDataTemplates,如http://blogs.msdn.com/b/mikehillberg/archive/2009/10/30/treeview-and-hierarchicaldatatemplate-step-by-step.aspx中所述。