【发布时间】:2016-10-19 23:24:28
【问题描述】:
我想在TreeView 中可视化Test 类的集合(来自模型程序集的POCO)。每个Test 实例都有一个Readers 和Groups 的集合:
测试类伪代码
public class Test
{
// properties
public ObservableCollection<Reader> Readers { get; set; }
public ObservableCollection<Group> Groups { get; set; }
}
我想要什么
我的目标是像这样在TreeView 中可视化测试:
Test 1
|- Reader 1
|- Reader 2
|- Group 1
|- Group 2
Test 2
|- Reader 1
|- Group 4
|- Group 5
到目前为止我得到了什么
我可以使用 HierarchicalDataTemplate 向测试和读者展示
<HierarchicalDataTemplate DataType="{x:Type model:Test}" ItemsSource="{Binding Readers}">
<TextBlock Text="{Binding Name}" />
</HierarchicalDataTemplate>
基本上我想告诉TreeView,“嘿,我的测试类中有另一个带有另一个模板的子项源,使用它!”。
我尝试使用读者和组的CompositeCollection,但由于我不想更改测试类(它是生成的代码)而卡住了。
【问题讨论】:
-
Reader和Group共享任何基础吗?如果是这样,您可以公开基本类型的 Collection,然后在 XAML 中使用不同的 DataTemplates 对每个具体类型(Reader和Group)进行不同的处理 -
[基本上我想告诉 TreeView,“嘿,我的测试类中有另一个带有另一个模板的子项源,使用它!”]。这就是为什么他们称之为 MVVM 并创建视图模型以方便的形式(例如 CompositeCollection )为视图提供数据。
-
@ASh:您建议将测试类转换为对视图更方便的东西,例如具有读者和组的复合集合的 TestViewModel。对吗?
-
@nabulke,不完全是。我将保留 Test (model) 类,但为其添加 TestViewModel,并确保 TestViewModel 具有可用作 ItemsSource 的 Readers 和 Groups 的集合属性
-
@nabulke,或者其他方式:在 xaml 中定义 CompositeCollection 并为 Readers 和 Groups 使用两个数据绑定 CollectionContainers