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

时间:2011-01-21 05:12:10

标签: wpf mvvm unity-container prism viewmodel

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

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

问题是当ViewModel的构造函数中存在参数时,此方法将无效。

public RibbonViewModel(IEventAggregator eventAggregator)
{
    this.eventAggregator = eventAggregator;
}

我收到错误:

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

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

3 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:2)

考虑使用ViewModelLocator。在上面的例子中,不是将datacontext绑定到ViewModel,而是绑定到一个知道如何从(unity)容器中解析ViewModel的定位器,并在此过程中将任何依赖项注入构造函数。有一篇博客文章总结了John Papa and Glenn Block(棱镜背后的人之一)的实施。

我认为默认情况下EventAggregator已在容器中注册,因此当您从容器中解析VM时,它应该与VM自动连接。


我应该提到above blog的代码正在使用MEF。这个blog我相信有一个使用统一的代码复合示例

答案 2 :(得分:1)

我不使用统一或棱镜。但是,为什么你不能这样做:

userControl.DataContext = ribbonViewModelInstance;

您可以在设置的用户控件上具有依赖项属性。在设置此依赖项属性的值时,可以设置datacontext。