2011-03-04 36 views
1

我有一個應用程序,我嘗試使用MVVM模式進行設計。在我的模型中,我有Group和Case。一個組可能包含其他組以及案例。現在,我想在View中的TreeView中顯示這些內容。所以,因爲組可以包含其他組和情況下,樹可以最終看起來是這樣的:
集團
- 集團
---- 案例
---- 案例
- 集團
---- 集團
---- 案例
- 案例
案例避免用TreeView和HierarchicalDataTemplate打破MVVM

我有我查看連接到包含組的一個ObservableCollection一個視圖模型。我的問題是,我可以讓TreeView顯示的唯一方法是在指向數據類型(Group或Case)的資源中使用HierarchicalDataTemplate,我覺得這是打破MVVM(View應該不知道型號)。

這工作:

<UserControl.Resources> 
    <HierarchicalDataTemplate DataType="{x:Type models:Group}" ItemsSource="{Binding Children}"> 
     <TextBlock Text="{Binding GroupName}" /> 
    </HierarchicalDataTemplate> 
    <DataTemplate DataType="{x:Type models:Case}"> 
     <TextBlock Text="{Binding CaseName}" /> 
    </DataTemplate> 
</UserControl.Resources> 

和樹視圖:

<TreeView ItemsSource="{Binding AvailableCaseGroups}" /> 

這是打破MVVM的精神?我該如何做到這一點呢?

回答

1

如果View知道ViewModel,我不認爲它完全打破了MVVM。 當然,在View中使用模型細節對MVVM來說並不合適。 要解決這一點,你可以只建立起來的ViewModels的一些層次結構 - MainViewModel - GroupViewModel G1 --- GroupViewModel G1A --- CaseViewModel C1B - GroupVieModel G2 ... 然後,它不再是一個結構您的模型的細節,但您的一個ViewModel,可以使用視圖。如果模型將來可能會發生結構性變化,變成一個扁平列表或s.th.,您的ViewModel仍然可以堅持舊的層次結構(變換模型),並且您的視圖仍然有效。

+0

問題是,這種方式視圖知道模型。在真正的MVVM中,View只應該瞭解ViewModel,而ViewModel應該處理與Model的所有交互。 – KrisTrip 2011-03-04 20:25:26

+1

啊,謝謝你澄清這一點,我讀你錯了。當然,在View中使用模型細節對於MVVM來說並不合適。 要解決這一點,你可以只建立起來的ViewModels的一些層次結構 - MainViewModel - GroupViewModel G1 --- GroupViewModel G1A --- CaseViewModel C1B - GroupVieModel G2 ... 然後它不再您的模型的結構細節,但是您的ViewModel中的一個可以被視圖使用。 如果模型可能在未來發生結構性改變,變成一個扁平列表或s.th.,您的ViewModel仍然可以堅持舊的層次結構(轉換模型),並且您的視圖仍然有效。 – 2011-03-05 13:04:33

+0

好的建議。我會試一試。你介意編輯你原來的答案來反映這個嗎?這樣我可以接受它,如果它運作。 – KrisTrip 2011-03-07 14:31:17

0

我與多個層次數據模板有類似的情況,並使用模板選擇器爲樹中適當的級別選擇適當的模板。

我的數據存在的問題是樹視圖在3個級別,每個級別都在不同的綁定/屬性不同的類。

在這種情況下,我認爲它並沒有真正打破MVVM的精神,因爲有時View必須知道它所綁定的數據。