WPF TreeView构造 - 对每个项目使用视图/视图模型是否良好?

时间:2013-06-20 08:52:43

标签: wpf mvvm caliburn.micro

假设我有一些我想在TreeView中显示的分层数据。

interface IName
{
    string Name
    {
        get;
    }
}

interface IUniversity:IName
{
    IDepartment[] Departments
    {
        get;
    }
}

interface IDepartment:IName
{
    IStudents[] Students
    {
        get;
    }
}

interface IStudent:IName
{

}

现在我从某些IUniversity收到DataService的集合,我想在TreeView中显示它。

第一种方法是使用已知且常用的HierarchicalDataTemplate,因此我不会谈论它。我最近发现的另一种方法是使用caliburn.micro.View.Model

<ContentControl cm:View.Model={Binding Universities} />

并且对于每种类型,我在Generic View模型中定义了一个关系:

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,...)

将新项添加到子集合

时将应用此选项

我有通讯员查看部门视图:

<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> 

所以简而言之: 第二个解决方案将每个项目映射到它自己的view-viewmodel,而不是使用模板作为集合视图模型(第一种方法)

我不相信哪种方法更好(最后这是一个问题): 第一种方法具有更少的代码和更好的性能。 二是更清楚?我认为 特别重要的是性能,第二种方法是否必然更昂贵?

1 个答案:

答案 0 :(得分:1)

我总是倾向于过早优化的清洁度和可读性。正如Sniffer指出的那样,正确优化的唯一方法是使用大数据集运行测试,并查看哪一个胜出。我通常发现虽然计算机的运行速度比我倾向于的速度快得多。