我有一個應用程序,我嘗試使用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的精神?我該如何做到這一點呢?
問題是,這種方式視圖知道模型。在真正的MVVM中,View只應該瞭解ViewModel,而ViewModel應該處理與Model的所有交互。 – KrisTrip 2011-03-04 20:25:26
啊,謝謝你澄清這一點,我讀你錯了。當然,在View中使用模型細節對於MVVM來說並不合適。 要解決這一點,你可以只建立起來的ViewModels的一些層次結構 - MainViewModel - GroupViewModel G1 --- GroupViewModel G1A --- CaseViewModel C1B - GroupVieModel G2 ... 然後它不再您的模型的結構細節,但是您的ViewModel中的一個可以被視圖使用。 如果模型可能在未來發生結構性改變,變成一個扁平列表或s.th.,您的ViewModel仍然可以堅持舊的層次結構(轉換模型),並且您的視圖仍然有效。 – 2011-03-05 13:04:33
好的建議。我會試一試。你介意編輯你原來的答案來反映這個嗎?這樣我可以接受它,如果它運作。 – KrisTrip 2011-03-07 14:31:17