2013-04-17 35 views
1

我有一個模型的自定義DP(DependencyProperty)。我的意思是DP的類型與模型的類型相同。具有模型類型和自動創建ViewModel的自定義DependencyProperty

如果我將模型設置爲DP,只要視圖可以使用模型屬性,一切都很好。

現在我來到了一個需要引入ViewModel並且不想改變DP類型的點。 ViewModel應該是View用戶隱藏的實現細節。視圖的用戶應綁定模型而不是ViewModel。我在許多地方通過註冊一個PropertyChangedEvent(在DP註冊上)並在內部控件的DataContext直接設置在事件處理程序中。

由於這在我看來是一種常見的手術,我認爲我是在跛腳地做。 DP邊界模型在視圖中更改並綁定時,是否有更簡化,更優雅的方式來創建ViewModel?

+1

我不認爲這是MVVM的常用方式。你的視圖的DataContext應該是ViewModel而不是Model。你基本上做的是讓你的模型成爲一個ViewModel,然後現在你有另一個ViewModel?只需將視圖的datacontext設置爲ViewModel,然後將模型作爲虛擬機中的屬性公開,並且該模型實現INPC。更改應傳播到視圖 – Viv

+0

只要模型非常簡單,虛擬機的開銷很大,就不會直接綁定到模型。但問題的關鍵是,DP不應該是一個ViewModel,我真的想綁定一個自定義的模型,並讓View創建ViewModel並執行與VM的綁定,而無需編寫大量代碼。也許使用轉換器將DP轉換爲ViewModel?也許你是對的,應該把DP變成ViewModels ......我不知道這種情況下的最佳實踐。 – jdehaan

+0

我不明白爲什麼虛擬機是一個巨大的開銷。它給出了明確的關注點,並在M - > V中起到橋樑作用。不管你是否有轉換器,因爲你只能有1個DataContext,而且最終創建你的VM需要設置View的DataContext,但你的模型作爲視圖的DataContext。除非你打破了你不會得到你需要的東西。你可以創建虛擬機作爲模型中的一個屬性,從而讓你的綁定從視圖訪問它通過模型,但這是一個混亂,我不會再調用MVVM。 – Viv

回答

1

是因爲你提到您的評論的,你並不需要一個DP保持模型或視圖模型,通常儘量避免編碼成這樣的情況下,除非一些邊緣的情況下要求它無論出於何種原因。使用DP來擴展Control/View的功能,而不是存儲Model或ViewModel。

這是邏輯我一般遵循:

假設我們有一個型號:爲MyModel,瀏覽:ParentView,Child1View,Child2View

  • 按次有1 VM。因此,我們有3個虛擬機的ParentViewModel,Child1ViewModel,...
  • 有它的父視圖資源聲明DataTemplate與孩子ViewModel的的DataTypeDataTemplate的其相應子視圖Content

例子:

<DataTemplate DataType="{x:Type local:Child1ViewModel}"> 
    <local:Child1View /> 
</DataTemplate> 
  • 現在在ParentView設置它的DataContextlocal: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,如果在模型中進行更改,更改將自動反映在視圖中。

就是這樣,坐視時功能在相應部分被添加在今後

請注意,在此之上,如果你使用類似團結你依賴注入和排序從而進一步使生活你的應用發展當你的應用程序正在增長時,很容易很多

+0

感謝您詳細介紹您正在使用的方法。我可以從這個經歷中受益良多。我需要閱讀更多關於MVVM的知識,在此之前我有一個實用的方法來學習它。我覺得我被困在一個足夠好的水平,可以開始閱讀更多有關該主題的理論和信息,從而變得更好。我的方法是實驗性和糟糕的,這就是我現在意識到的。 – jdehaan

相關問題