2011-01-21 53 views
4

我正在使用Prism和Unity来使用MVVM模式重写WPF应用程序。大多数意见都通过DataContext属性连接到虚拟机,就像这样:如何在视图模型在构造函数中包含参数时将ViewModel连接到视图?

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

的问题是,当在视图模型的构造函数的参数这种方法是行不通的。

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

我得到的错误:

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

当有参数时,如何将虚拟机连接到视图?

回答

5

您可能会看看WPF Application Framework (WAF)的示例应用程序。在这些例子中,IoC Container(就你的Unity而言)负责创建ViewModels。这样ViewModel可以有构造函数参数。 IoC容器也负责将View与ViewModel结合在一起。也许这也是你的ViewModel设计的一个选项。

1

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

userControl.DataContext = ribbonViewModelInstance; 

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

+0

谢谢,我只是试过,并没有奏效。问题是,当你实例化一个VM的新实例时,你必须在构造函数中包含一个参数。 – Scifiballer24 2011-01-21 05:24:42

+0

此代码是正确的。您应该使用Unity容器实例化视图和视图模型,并在代码隐藏中剔除DataContext。 – 2011-01-21 07:52:44

2

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

我相信EventAggregator在默认情况下是在容器中注册的,因此当您从容器中解析虚拟机时,它应该与VM自动连线。


我应该提到above blog的代码是使用MEF。这blog我相信有一个使用统一的codeplex示例

+0

谢谢,这是有点清理它。我想我一直在使用视图优先的方法,现在它正在赶上我。我会先看看虚拟机,然后决定哪种方法最好。谢谢! – Scifiballer24 2011-01-21 16:39:17

相关问题