2013-06-20 21 views
2

假設我有一些分層數據,我想在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> 

所以把事情短: 第二個解決方案映射每個項目,以它自己的視圖查看模型,而不是使用模板的集合視圖模型(第一種方法)

我不相信這方法更好(最後這是一個問題): 第一種方法的代碼少得多,性能也更好。 二更清晰?我認爲 尤其重要的是性能,第二種方法是否必然更昂貴?

+0

選項2似乎創造更多的對象,所以人們會認爲它有點慢,但如果你真的關心性能,那麼你應該使用一些巨大的數據集使用這兩種技術的性能測試,看看會發生什麼。 –

回答

1

我總是傾向於過早優化的清潔度和可讀性。正如嗅探器指出的那樣,正確優化的唯一方法是使用大數據集對兩者進行測試,看看哪一個勝出。我通常會發現,雖然電腦的運行速度比我傾向於提供的功勞要快得多。

相關問題