2011-02-23 76 views
0

最近我開始在Silverlight中使用Prism。我想使用EventAggregator在兩個ViewModel之間訂閱和發佈事件。正如我在一些指南中看到的,ViewModel的ctor應該接受IEventAggregator作爲參數。我無法找到如何做到這一點,因此我的視圖總是想用無參數ctor初始化ViewModel。棱鏡MVVM - 如何將IEventAggregator傳遞給我的ViewModel

我的視圖模型構造函數:

MyViewModel(IEventAggregator eventAggregator) 
{ 
    // get the event.... 
} 

筆者認爲:

<UserControl ....> 

    <UserControl.Resources> 
     <ViewModels:MyViewModel x:Key="MyViewModel"/> 
    </UserControl.Resources> 

    <Grid x:Name="LayoutRoot" DataContext="{Binding Source={StaticResource MyViewModel}}"> 
    .... 
    <Grid/> 

</UserControl> 

我可以實例化視圖模型的視圖的構造函數,然後將其分配給其的DataContext,但我必須有在我的視圖,我也無法得到一個IEventAggregator。但這可能不是將IEventAggregator(或任何其他對象 - 例如IUnityContainer)傳遞給ViewModel的正確方法。

有人能告訴我我做錯了什麼嗎?

回答

2

你必須通過統一來解決你的依賴關係。看看棱鏡MVVM的例子和UI組成。在那裏視圖不會創建視圖模型,但它恰恰相反。視圖模型獲取通過構造函數注入注入的視圖。視圖模型將自身設置爲視圖視圖模型:

public interface IView 
{ 
    IViewModel ViewModel{get;set;} 
} 

public interface IViewModel { } 

public View:UserControl, IView 
{ 
    public IViewModel ViewModel 
    { 
     get{return DataContext as IViewModel;} 
     set{DataContext = value;} 
    } 
} 

public ViewModel:IViewModel 
{ 
    public ViewModel(IView view, IEventAggregator eventAggregator) 
    { 
     view.ViewModel = this; 
     //get the event... 
    } 
} 

使用這種方法,你必須註冊視圖模型和視圖統一。之後,您只需解析視圖模型,視圖就由容器注入。

要使用戶界面上的視圖正確顯示,必須使用RegionManager將視圖註冊到區域。全部設置完成後,創建一個新的視圖模型實例將導致將視圖添加到註冊區域,以便它顯示在用戶界面上。

+0

這是正確的方法。 – Maciek 2011-02-23 14:14:35

+0

感謝您的回覆。你在哪裏實例化視圖模型? – leeran 2011-02-23 16:03:16

+0

@ leeran88:我們需要看到更多的應用程序來回答這個問題。基本上在這種情況下,你將首先實例化視圖,然後實例化視圖模型,然後結合這兩個視圖。在這種情況下,您的視圖也必須實現IView界面。 – 2011-02-23 20:17:12

1

除了讓ViewModel將自己掛接到視圖的數據上下文(我根本不喜歡)之外,我還可以在Silverlight中想到兩個其他選項。

  1. 利用ServiceLocator模式允許靜態資源通過容器創建自己。 MVVMLight對此有相當好的模式。
  2. 使用像Caliburn.Micro這樣的框架,該框架插入了一組很好的約定,這些約定將根據命名約定(包括綁定和視圖模型)來連接許多事物。