Prism MVVM - 如何将IEventAggregator传递给我的ViewModel

时间:2011-02-23 12:02:48

标签: silverlight mvvm silverlight-4.0 unity-container prism

最近我开始在Silverlight中使用Prism。我想使用EventAggregator在两个ViewModel之间订阅和发布事件。正如我在一些指南中看到的那样,ViewModel的ctor应该接受IEventAggregator作为参数。我无法找到如何做到这一点因此我的View总是希望用无参数的ctor初始化ViewModel。

我的ViewModel ctor:

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>

我可以在View的ctor中实例化ViewModel,然后将它分配给它的DataContext,但是我必须在我的View中有一个IEventAggregator,我也无法得到它。但这可能不是将IEventAggregator(或任何其他对象! - 例如IUnityContainer)传递给ViewModel的正确方法。

有人能告诉我我做错了吗?

3 个答案:

答案 0 :(得分: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将视图注册到区域。完成所有设置后,创建新的视图模型实例会导致将视图添加到已注册的区域,以便它显示在用户界面上。

答案 1 :(得分:1)

除了将ViewModel挂钩到视图的数据上下文(我完全不喜欢)之外,还有其他两个我可以在Silverlight中考虑的选项。

  1. 利用ServiceLocator模式允许静态资源通过容器创建自己。 MVVMLight对此有一个相当好的模式。
  2. 使用类似Caliburn.Micro的框架,它插入了一组很好的约定,这些约定将基于命名约定(包括绑定和视图模型)连接许多内容。

答案 2 :(得分:0)

也许你已经解决了,但

http://www.emileinarsson.se/silverlight-4-mvvm-prism-unity-dependency-injection/

这篇文章解释了如何在MVVM环境中使用Unity。