2012-10-26 29 views
6

在MVVM設計中,如果View創建ViewModel,ViewModel應該如何知道其Model?Model應該如何傳入ViewModel?

我從幾個地方讀到Model可以通過它的構造函數傳遞給ViewModel。所以它看起來是這樣的:

class ViewModel { 
    private Model _model; 
    public ViewModel(Model model) { 
     _model = model; 
    } 
} 

由於視圖是創建視圖模型,以及模型傳遞到視圖模型的構造函數,然後在視圖有了解的模型。但從我從大多數MVVM設計中看到的UML圖表來看,View似乎並不瞭解模型的任何內容。

Model應該如何傳入ViewModel?

回答

2

你幾乎走在正確的軌道上,你只是錯過了一個重要的信息。

是的,一個模型可以傳遞給構造函數的視圖模型 - 這就是所謂的依賴注入,或者可以是Inversion of Control(IoC)。

實現此目的最簡單的方法是使用Prism的UnityContainer。在應用程序啓動的某個地方,您可以使用Unity容器註冊接口及其相應的實現類型,然後在Unity容器上調用Resolve<MyInterface>()以獲取與該實例關聯的類型的物理實例。

Unity在哪裏可以真正幫助你,它會自動解析儘可能多的構造函數參數,因爲它可能會告訴它解析類型。因此,如果你在你的視圖模型的構造是這樣的:

public class MyViewModel : IMyViewModel 
{ 
    public MyViewModel(IUnityContainer container, IMyModel model) 
    { 
     _container = container; 
     _model = model; 
     ...etc... 
    } 
} 

和你的觀點做到這一點:

this.DataContext = container.Resolve<IMyViewModel>(); 

團結容器將那麼新了MyViewModel類的實例,因爲它它也將解決和新增與IMyModel關聯的類的實例。

+0

謝謝!我沒有使用Prism和UnityContainer。從你提到的看來,這個想法似乎是在ViewModel的構造函數中使用Model的接口。但在這種情況下,ViewModel如何知道Model中的方法和數據?模型的接口是一個類似於所有模型實現的'IModel'的接口,或者對於每個模型將會有單獨的接口,就像'MyFirstModel','IMyFirstModel','MySecondModel'有'IMyFSecondModel '等等? – Carven

相關問題