2011-01-21 56 views
4

我正在使用Prism和Unity來使用MVVM模式重寫WPF應用程序。大多數意見都通過DataContext屬性連接到虛擬機,就像這樣:如何在視圖模型在構造函數中包含參數時將ViewModel連接到視圖?

<UserControl.DataContext> 
    <VM:RibbonViewModel/> 
</UserControl.DataContext> 

的問題是,當在視圖模型的構造函數的參數這種方法是行不通的。

public RibbonViewModel(IEventAggregator eventAggregator) 
{ 
    this.eventAggregator = eventAggregator; 
} 

我得到的錯誤:

類型「RibbonViewModel」不可用作對象元素,因爲它是不公開或不定義一個公共的無參數的構造函數或類型轉換器。

當有參數時,如何將虛擬機連接到視圖?

回答

5

您可能會看看WPF Application Framework (WAF)的示例應用程序。在這些例子中,IoC Container(就你的Unity而言)負責創建ViewModels。這樣ViewModel可以有構造函數參數。 IoC容器也負責將View與ViewModel結合在一起。也許這也是你的ViewModel設計的一個選項。

1

我不使用統一體或棱鏡。但是,爲什麼你不能這樣做:

userControl.DataContext = ribbonViewModelInstance; 

你可以在設置的用戶控件上有一個依賴屬性。在設置此依賴項屬性的值時,可以設置datacontext。

+0

謝謝,我只是試過,並沒有奏效。問題是,當你實例化一個VM的新實例時,你必須在構造函數中包含一個參數。 – Scifiballer24 2011-01-21 05:24:42

+0

此代碼是正確的。您應該使用Unity容器實例化視圖和視圖模型,並在代碼隱藏中剔除DataContext。 – 2011-01-21 07:52:44

2

考慮使用ViewModelLocator。在上面的例子中,不是將數據上下文綁定到ViewModel,而是綁定到一個定位器,該定位器知道如何從(統一)容器中解析ViewModel,並在該過程中將任何依賴關係注入到構造器中。有一篇博客文章總結了John Papa and Glenn Block(棱鏡背後的人之一)的實現。

我相信EventAggregator在默認情況下是在容器中註冊的,因此當您從容器中解析虛擬機時,它應該與VM自動連線。


我應該提到above blog的代碼是使用MEF。這blog我相信有一個使用統一的codeplex示例

+0

謝謝,這是有點清理它。我想我一直在使用視圖優先的方法,現在它正在趕上我。我會先看看虛擬機,然後決定哪種方法最好。謝謝! – Scifiballer24 2011-01-21 16:39:17

相關問題