最近我开始在Silverlight中使用Prism。我想使用EventAggregator在两个ViewModel之间订阅和发布事件。正如我在一些指南中看到的那样,ViewModel的ctor应该接受IEventAggregator作为参数。我无法找到如何做到这一点因此我的View总是希望用无参数的ctor初始化ViewModel。
我的ViewModel ctor:
MyViewModel(IEventAggregator eventAggregator)
{
// get the event....
}
我的观点:
<UserControl ....>
<UserControl.Resources>
<ViewModels:MyViewModel x:Key="MyViewModel"/>
</UserControl.Resources>
<Grid x:Name="LayoutRoot" DataContext="{Binding Source={StaticResource MyViewModel}}">
....
<Grid/>
</UserControl>
我可以在View的ctor中实例化ViewModel,然后将它分配给它的DataContext,但是我必须在我的View中有一个IEventAggregator,我也无法得到它。但这可能不是将IEventAggregator(或任何其他对象! - 例如IUnityContainer)传递给ViewModel的正确方法。
有人能告诉我我做错了吗?
答案 0 :(得分:2)
你必须通过团结来解决你的依赖。看看棱镜MVVM的例子和ui组成。在那里视图不会创建视图模型,但它完全相反。视图模型通过构造函数注入获取注入的视图。视图模型将自身设置为视图的视图模型:
public interface IView
{
IViewModel ViewModel{get;set;}
}
public interface IViewModel { }
public View:UserControl, IView
{
public IViewModel ViewModel
{
get{return DataContext as IViewModel;}
set{DataContext = value;}
}
}
public ViewModel:IViewModel
{
public ViewModel(IView view, IEventAggregator eventAggregator)
{
view.ViewModel = this;
//get the event...
}
}
使用此方法,您必须将视图模型和视图注册为统一。之后您只需要解析视图模型,视图就由容器注入。
要在用户界面上将视图移到正确的位置,您必须使用RegionManager将视图注册到区域。完成所有设置后,创建新的视图模型实例会导致将视图添加到已注册的区域,以便它显示在用户界面上。
答案 1 :(得分:1)
除了将ViewModel挂钩到视图的数据上下文(我完全不喜欢)之外,还有其他两个我可以在Silverlight中考虑的选项。
答案 2 :(得分:0)
也许你已经解决了,但
http://www.emileinarsson.se/silverlight-4-mvvm-prism-unity-dependency-injection/
这篇文章解释了如何在MVVM环境中使用Unity。