我正在使用Prism和Unity使用MVVM模式重写WPF应用程序。大多数视图都通过DataContext属性连接到VM,如下所示:
<UserControl.DataContext>
<VM:RibbonViewModel/>
</UserControl.DataContext>
问题是当ViewModel的构造函数中存在参数时,此方法将无效。
public RibbonViewModel(IEventAggregator eventAggregator)
{
this.eventAggregator = eventAggregator;
}
我收到错误:
类型'RibbonViewModel'不能用作对象元素,因为它不是公共的,或者没有定义公共无参数构造函数或类型转换器。
当参数存在时,如何将VM连接到View?
答案 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。