假设我有一些分层数据,我想在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}" />
对于Student,我也有StudentView:
<TextBlock Text="{Binding Name}" />
,最后在显示大学的父视图:
<TreeView.Resources>
<HierarchicalDataTemplate x:Key="TVItem" ItemsSource="{Binding Path=Childrens}">
<ContentControl cm:View.Model="{Binding}" />
</HierarchicalDataTemplate>
</TreeView.Resources>
简单来说:第二种解决方案将每个项目映射到自己的视图-视图模型,而不是为集合视图模型使用模板(第一种方法)
我不确定哪种方法更好(最后这是一个问题):第一种方法代码更少,性能更好。第二个更清楚吗?我认为特别重要的是性能,第二种方法是否一定更昂贵?
我总是倾向于清洁度和可读性,而不是过早的优化。正如Sniffer所指出的那样,正确优化的唯一方法是使用大型数据集对两者进行测试,然后看看哪一个会胜出。我通常发现电脑的运行速度比我想象的要快得多。