是因爲你提到您的評論的,你並不需要一個DP保持模型或視圖模型,通常儘量避免編碼成這樣的情況下,除非一些邊緣的情況下要求它無論出於何種原因。使用DP來擴展Control/View的功能,而不是存儲Model或ViewModel。
這是邏輯我一般遵循:
假設我們有一個型號:爲MyModel,瀏覽:ParentView,Child1View,Child2View
- 按次有1 VM。因此,我們有3個虛擬機的ParentViewModel,Child1ViewModel,...
- 有它的父視圖資源聲明
DataTemplate
與孩子ViewModel
的的DataType
和DataTemplate
的其相應子視圖Content
。
例子:
<DataTemplate DataType="{x:Type local:Child1ViewModel}">
<local:Child1View />
</DataTemplate>
- 現在在ParentView設置它的
DataContext
爲local:ParentViewModel
- 在ParentViewModel創建一個屬性(CurrentViewModel)舉行ChildModels。我使用MVVM Light,因此我的屬性類型通常是
ViewModelBase
,這是我所有的ViewModel的。
- 在ParentView相應綁定ContentControl中的內容到這個屬性
例子:
<ContentControl Content="{Binding CurrentViewModel}" />
現在僅通過切換在ParentViewModel這個屬性您ContentControl
得到相應的更新,你沒有必要添加任何DP的。
現在,如果MyModel實現了INPCM自身的MVVM Light,可以通過使模型繼承自ObservableObject
(嘗試不使用ViewModelBase
作爲Models的基類來實現。這只是混亂,並增加了混亂),你可以只露出模型作爲一個屬性(ModelProperty)您的視圖模型的
每個
因此相應的視圖綁定到一個模型所有你會做的是像
<TextBlock Text="{Binding ModelProperty.TextBlockText}" />
現在,因爲模型實現了INPC,如果在模型中進行更改,更改將自動反映在視圖中。
就是這樣,坐視時功能在相應部分被添加在今後
請注意,在此之上,如果你使用類似團結你依賴注入和排序從而進一步使生活你的應用發展當你的應用程序正在增長時,很容易很多
來源
2013-04-17 13:17:11
Viv
我不認爲這是MVVM的常用方式。你的視圖的DataContext應該是ViewModel而不是Model。你基本上做的是讓你的模型成爲一個ViewModel,然後現在你有另一個ViewModel?只需將視圖的datacontext設置爲ViewModel,然後將模型作爲虛擬機中的屬性公開,並且該模型實現INPC。更改應傳播到視圖 – Viv
只要模型非常簡單,虛擬機的開銷很大,就不會直接綁定到模型。但問題的關鍵是,DP不應該是一個ViewModel,我真的想綁定一個自定義的模型,並讓View創建ViewModel並執行與VM的綁定,而無需編寫大量代碼。也許使用轉換器將DP轉換爲ViewModel?也許你是對的,應該把DP變成ViewModels ......我不知道這種情況下的最佳實踐。 – jdehaan
我不明白爲什麼虛擬機是一個巨大的開銷。它給出了明確的關注點,並在M - > V中起到橋樑作用。不管你是否有轉換器,因爲你只能有1個DataContext,而且最終創建你的VM需要設置View的DataContext,但你的模型作爲視圖的DataContext。除非你打破了你不會得到你需要的東西。你可以創建虛擬機作爲模型中的一個屬性,從而讓你的綁定從視圖訪問它通過模型,但這是一個混亂,我不會再調用MVVM。 – Viv