【问题标题】:Prism MVVM - How to pass an IEventAggregator to my ViewModelPrism MVVM - 如何将 IEventAggregator 传递给我的 ViewModel
【发布时间】:2011-03-18 16:01:13
【问题描述】:

最近我开始在 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 的正确方法。

谁能告诉我我做错了什么?

【问题讨论】:

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


    【解决方案1】:

    你必须通过团结来解决你的依赖。查看 prism 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 将视图注册到区域。当这一切都设置好后,创建一个新的视图模型实例会导致将视图添加到注册区域中,以便它显示在用户界面上。

    【讨论】:

    • 感谢您的回复。你在哪里实例化视图模型?
    • @leeran88:我们需要查看更多您的应用程序才能回答这个问题。基本上在这种情况下,您将首先实例化视图,然后实例化视图模型,然后将两者结合起来。在这种情况下,您的视图也必须实现 IView 接口。
    【解决方案2】:

    除了让 ViewModel 自己连接到视图的数据上下文(我一点也不喜欢)之外,我还可以在 Silverlight 中想到另外两个选项。

    1. 利用 ServiceLocator 模式允许您的静态资源通过容器自行创建。 MVVMLight 有一个相当好的模式。
    2. 使用像Caliburn.Micro 这样的框架,它插入了一组很好的约定,这些约定将根据命名约定连接许多东西,包括绑定和视图模型。

    【讨论】:

      【解决方案3】:

      也许你已经解决了,但是

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

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

      【讨论】:

      • 您好,感谢您的回复。我已经以不同的模式解决了它,但这是一个很棒的帖子。我会订阅你的博客:)
      猜你喜欢
      • 2016-09-23
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-20
      • 2020-01-27
      • 2011-05-06
      相关资源
      最近更新 更多