【发布时间】:2013-06-20 08:52:43
【问题描述】:
假设我有一些分层数据要显示在 TreeView 中。
interface IName
{
string Name
{
get;
}
}
interface IUniversity:IName
{
IDepartment[] Departments
{
get;
}
}
interface IDepartment:IName
{
IStudents[] Students
{
get;
}
}
interface IStudent:IName
{
}
现在我从一些DataService 获得IUniversity 的集合,我想在TreeView 中显示它。
第一种方法是使用HierarchicalDataTemplate,这是已知且常用的,因此我不再赘述。我最近发现的另一种方法是使用caliburn.micro.View.Model:
<ContentControl cm:View.Model={Binding Universities} />
对于每种类型,我在通用视图模型中定义了一个关系:
class ParentChildenViewModel<TP,TC>
{
ObservableCollection<TC> Childrens
{
get;
}
Action<TC> ChildFactory;
}
现在每个类型都有对应ViewModel和一个视图IDepartment:
class DepartmentViewModel: ParentChildenViewModel<IDepartment,IStudent>
{
Action<IStudent> ChildFactory;
ObservableCollection<IStudent> Childrens
{
get;
}
}
所以在构造 DepartmentViewModel 的时候,我传入了它的构造函数:
(student => new StudentViewModel(student,...)
这将在将新项目添加到子集合中时应用
我有通讯员View DepartmentView:
<TextBlock Text="{Binding Name}" />
对于学生,我也有 StudentView:
<TextBlock Text="{Binding Name}" />
最后在显示大学的父视图中:
<TreeView.Resources>
<HierarchicalDataTemplate x:Key="TVItem" ItemsSource="{Binding Path=Childrens}">
<ContentControl cm:View.Model="{Binding}" />
</HierarchicalDataTemplate>
</TreeView.Resources>
简而言之: 第二种解决方案将每个项目映射到它自己的视图视图模型,而不是使用集合视图模型的模板(第一种方法)
我不相信哪种方法更好(最后这是一个问题): 第一种方法的代码少得多,性能更好。 第二个更清楚?我认为 尤其重要的是性能,第二种方法是否必然更昂贵?
【问题讨论】:
-
选项 2 似乎正在创建更多对象,因此人们会认为它有点慢,但是如果您真的关心性能,那么您应该使用一些性能测试与使用这两种技术的庞大数据集和看看会发生什么。
标签: wpf mvvm caliburn.micro