我有以下设置:
右侧结果:

要填充第一级表控件,我正在侦听“”-(这非常有用),当我收到该事件时,我会使用视图填充第一级选项卡区域:
Dim lReg As IRegion = Me.mRegionManager.Regions("FirstLevelTabReqion")
Dim lViewID As String = CommonDefinitions.Constants.BuildFirstLevelViewName(lUniqueID)
Dim lFirstLevelView FirstLevelView = TryCast(lReg.GetView(lRqViewID), FirstLevelView)
If lFirstLevelView Is Nothing Then
lFirstLevelView = New FirstLevelView()
Dim lRegMan1 As IRegionManager = lReg.Add(lFirstLevelView, lViewID, True)
lFirstLevelView.SetRegionManager(lRegMan1)
...
End If注意:创建FirstLevelView时,我必须提交一个CompositionInitializer.SatisfyImports调用,以确保FirstLevelView解析其ViewModel引用。
要在EventsAggregator的SecondLevel ViewModel中获得一个实例,我使用:
<ImportingConstructor()>
Public Sub New(ByVal iEvAggregator As IEventAggregator)
EventAggregator = iEvAggregator
EventAggregator.GetEvent(Of DoStuffSecondLevel).Subscribe(AddressOf OnDoStuffSecondLevel, True)
End Sub我的问题是,我在第二级视图模型中得到的EventAggregator实例与第一级的EventAggregator实例不同,所以如果我在第一级发布DoStuffSecondLevel,就不会在第二级捕捉到它。
为什么我要得到两个不同的EventAggregator实例?
如何在整个应用程序中共享EventAggregator的同一个实例?
提前感谢
发布于 2011-07-06 18:03:48
问题是,MefBootstrapper创建了一个容器,但没有将它注册为默认容器。当调用SatisfyImports时,MEF不会看到任何容器,因此它会创建一个新的容器。这就是为什么实例是不同的,因为正在创建两个不同的容器。要解决这个问题,只需将Prism容器设置为MEF要使用的默认容器。
Silverlight解决方案(在引导程序中):
protected override void InitializeShell()
{
base.InitializeShell();
//Make the container the default one.
CompositionHost.Initialize(this.Container);
//Etc.
}WPF (桌面)解决方案:
目前,我无法让桌面解决方案工作。问题是,MEF的ExportFactory<T>和ComponentInitializer只适用于Silverlight应用程序(为什么!!)Glen创建了一个库,它允许访问System.ComponentModel.Composition.Initialization.dll库的桌面版本。我试图使用它,但是失败了,因为在代码中,如果容器已经存在,它就会被设置为失败.再说一遍,为什么?我还没有尝试在这个解决方案中使用MEF2 (Codeplex预览),但我可以想象它会更好地工作(也许)。令人烦恼的是,如果您选择使用MEF2 ( Codeplex ),您必须重新构建Prism二进制文件,并用Codeplex MEF2库替换.NET 4 MEF库的所有引用。这使Prism能够在没有抱怨的情况下使用Codeplex MEF2库。我将尝试看看这样做是否使这个解决方案在WPF中可行。
https://stackoverflow.com/questions/6058741
复制相似问题