当视图模型在构造函数中有参数时,如何将视图模型连接到视图?

5

我正在使用Prism和Unity来使用MVVM模式重写WPF应用程序。大多数视图都通过DataContext属性连接到VM,如下所示:

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

问题在于,当ViewModel的构造函数中存在参数时,这种方法将无法工作。
public RibbonViewModel(IEventAggregator eventAggregator)
{
    this.eventAggregator = eventAggregator;
}

我遇到了以下错误:

类型“RibbonViewModel”无法用作对象元素,因为它不是公共的或者没有定义一个公共的无参构造函数或类型转换器。

当存在参数时,如何将VM连接到View?

3个回答

5

您可以查看WPF应用程序框架(WAF)的示例应用。在这些示例中,IoC容器(在您的情况下是Unity)负责创建ViewModels。这样,ViewModel可以具有构造函数参数。IoC容器还负责将View与ViewModel组合在一起。也许这对于您的ViewModel设计也是一个选项。


这正是我现在要走的路线。感谢链接,样例应用程序很有帮助。 - Scifiballer24

2
考虑使用ViewModelLocator。与上述情况中将数据上下文绑定到ViewModel不同,您绑定到一个定位器,该定位器知道如何从(unity)容器中解析ViewModel,并在此过程中将任何依赖项注入构造函数。有一篇博客文章总结了John Papa和Glenn Block(prism背后的人之一)的实现。
我相信EventAggregator默认已在容器中注册,因此当您从容器中解析VM时,它应自动连接到VM。
我应该提到上述博客中的代码使用MEF。我认为这篇博客有一个使用unity的codeplex示例。

谢谢,这有点澄清了。我想我一直在使用视图优先的方法,现在它追上了我。我会研究 VM 优先并决定哪种方法最好。谢谢! - Scifiballer24

1

我不使用Unity或Prism。但是,你为什么不能这样做:

userControl.DataContext = ribbonViewModelInstance;

您可以在用户控件上拥有一个设置的依赖属性。在设置此依赖属性的值时,您可以设置数据上下文。


谢谢,我刚试了一下,但不起作用。问题在于当你实例化一个新的虚拟机时,你仍然必须在构造函数中包含一个参数。 - Scifiballer24
这段代码是正确的。你应该使用Unity容器来实例化视图和视图模型,并在代码后台分配DataContext。 - Marat Khasanov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接