2

假设我有一些分层数据要显示在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} />

对于每种类型,我在通用视图模型中定义了一个关系:

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> 

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

我不相信哪种方法更好(最后这是一个问题):第一种方法的代码少得多,性能更好。第二个更清楚?我认为特别重要的是性能,第二种方法一定更贵吗?

4

1 回答 1

1

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

于 2013-07-03T10:38:23.230 回答