2013-04-11 24 views
1

我試圖圍繞WPF和MVVM我的頭。定義用戶控件的視圖模型的類型,然後從父控件中移交它

在我的測試應用程序中,我有一個MainViewModelChildViewModel屬性。
同樣地,我有一個實例化一個MainViewModel並有應該接收MainViewModel.ChildViewModel

對於我目前的應用程序中的子控件我有(剪斷,爲了簡潔)

<Window.DataContext> 
    <vm:MainWindowViewModel /> 
</Window.DataContext> 
<Window.Content> 
    <view:ChildView DataContext="ChildViewModel"/> 
</Window.Content> 

一個窗口的窗口如何我有我ChildView的用戶控件定義它需要一個類型爲ChildViewModel的數據上下文並且也可以接收它?

目前我通過設置它像這樣創建:

<UserControl.DataContext> 
    <vm:ChildViewModel> 
</UserControl.DataContext> 

但是這創造了ChildViewModel的新實例。

我試圖讓問題儘可能裸露。希望它仍然清晰
谷歌搜索出現了很多(競爭)的方法,但我不能再看到樹木的森林了。

回答

4

您的UserControl無需指定它自己的ViewModel - 您已經創建並綁定了它。

<view:ChildView DataContext="{Binding ChildViewModel}"/> 

的混亂可能來源於這樣的事實,有兩種截然不同的方法來MVVM:

話雖這麼說,你的綁定應符合規定。在Xaml的<DataContext>標籤內創建虛擬機是一種「視圖優先」的方法 - 視圖創建並實例化ViewModel。

您目前正在使用更多的ViewModel-First方法(類似於my series on MVVM),其中ViewModel創建了其他ViewModel,而VIew只是綁定了它們。我個人認爲,從代碼的角度來看,VM-first更容易維護,而且通常更喜歡它。 View-first具有(潛在地)提供更好的設計時間體驗的優點,這就是爲什麼許多MVVM提倡者使用這種方法。

+0

我仍然困惑於你的控件如何決定接受哪個DataContext。去檢查你的系列,看它是否可以清除任何東西 – 2013-04-12 11:49:54

+0

從第3部分開始,通過你的系列,但我沒有發現任何提及如何控制描述他們所需的模型。我忽略了什麼? – 2013-04-12 13:10:04

+0

@BorisCallens在VM-First中,控件通常不會*「指定」這個 - 事實上,使用多個ViewModel類型(不常見但可能)的控件是完全合理和可能的,因爲「合適的虛擬機」變成了虛擬機必須遵守的合同/ API才能與特定的控制一起工作。 – 2013-04-12 15:13:52

相關問題