假設我有一些分層數據,我想在TreeView
中顯示。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;
}
現在每種類型都有correspondet ViewModel
和視圖IDepartment
:
class DepartmentViewModel: ParentChildenViewModel<IDepartment,IStudent>
{
Action<IStudent> ChildFactory;
ObservableCollection<IStudent> Childrens
{
get;
}
}
所以構建DepartmentViewModel的時候,我通過它的構造:
(student => new StudentViewModel(student,...)
當一個新項目被添加到孩子
收集這將被應用,我有記者查看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似乎創造更多的對象,所以人們會認爲它有點慢,但如果你真的關心性能,那麼你應該使用一些巨大的數據集使用這兩種技術的性能測試,看看會發生什麼。 –