【问题标题】:Sharing a viewmodel between views and using the EventAggregator在视图之间共享视图模型并使用 EventAggregator
【发布时间】:2018-07-20 04:08:39
【问题描述】:

我有一个系统(使用 Prisim 和 MVVM),它有许多用于收集数据的视图。每个 View 都有自己的 ViewModel,当前将数据发送到公共数据类。 我一直在尝试(没有成功)创建一个 ViewModel,所有这些视图都可以使用它来保存不断更新的公共数据类。 但是我遇到了困难,因为我的共享 ViewModel 需要使用 EventAggregator。我的共享 ViewModel 的构造函数有 (IEventAgreggator eventAggregator) 作为参数。但是,当我尝试使用以下方法将我的视图绑定到此时:

    <UserControl.DataContext>
        <vm:DataViewModel/>
    </UserControl.DataContext>

我收到错误消息

“DataViewModel 不包含带 1 个参数的构造函数”

。有没有解决的办法?如果我使用自动装配,但似乎无法以这种方式在视图之间共享 ViewModel,我就没有这个问题。这是我的第一篇文章,如果这是一个愚蠢的问题,请道歉。谢谢

【问题讨论】:

  • 在用户控件中设置 DataContext 通常是一个非常糟糕的主意。 UserControls 应该是为您的模型或视图模型设计的。您不应该为您的 UserControl 设计视图模型。 TextBox 有 TextBoxViewModel 吗? 不, 而且有一个很好的理由。对于这种反模式的真实示例以及为什么它如此难以阅读this answer

标签: c# wpf mvvm viewmodel eventaggregator


【解决方案1】:

通常在基于 PRISM 的应用程序中,我们在容器中注册 ViewModel,以便它们可以通过 DI 容器自动解析。

您需要确保在 Module Initialize 方法中将新创建的 ViewModel 类型注册到容器中。

我们的应用程序中通常有 Unity 容器,我们必须在 Module Initialize 方法中执行以下操作。

Container.RegisterType<DataViewModel >(new ContainerControlledLifetimeManager());

希望对你有帮助!

【讨论】:

    【解决方案2】:

    请尝试以下代码。

    public Myusercontrol ()
    {
         InitializeComponent();
         DataViewModel vm = new DataViewModel (eventAggregator);
         this.DataContext = vm;
    }
    

    【讨论】:

    • 我仍然收到 InitializeCompent() 错误; of 'System.NullReferenceException: '对象引用未设置为对象的实例。'
    • 请您分享更多细节以及如何初始化对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-14
    • 1970-01-01
    • 2013-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多