WPF树视图构造-是否为每个项目使用视图/视图模型是好的



假设我有一些分层数据,我想在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所指出的那样,正确优化的唯一方法是使用大型数据集对两者进行测试,然后看看哪一个会胜出。我通常发现电脑的运行速度比我想象的要快得多。

相关内容

  • 没有找到相关文章

最新更新