And*_*ndo 5 .net silverlight prism mef eventaggregator
我有以下设置:
我使用MEF作为DI框架来连接我的应用程序的各个部分.
我有2个地区:
一个(左侧)填充了列表视图(例如客户)
其中一个(右侧)填充了一个视图,其中包含一个tabcontrol,其中包含我填充的区域(根据选择的客户),另一个视图包含带有区域的选项卡控件.
右侧结果:

为了填充第一级tabcontrol我正在听"客户更改的事件" - (这很好用)当我收到事件时,我用Views填充First Level选项卡区域:
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
Run Code Online (Sandbox Code Playgroud)
注意:创建FirstLevelView时,我必须CompositionInitializer.SatisfyImports调用以确保FirstLevelView解析其ViewModel引用.
要在SecondLevel ViewModel中获取EventsAggregator的实例,我使用:
<ImportingConstructor()>
Public Sub New(ByVal iEvAggregator As IEventAggregator)
EventAggregator = iEvAggregator
EventAggregator.GetEvent(Of DoStuffSecondLevel).Subscribe(AddressOf OnDoStuffSecondLevel, True)
End Sub
Run Code Online (Sandbox Code Playgroud)
我的问题是我在第二级视图模型中获得的EventAggregator实例与第一级中的EventAggregator实例不同,因此如果我在第一级发布DoStuffSecondLevel,它将不会在第二级捕获.
为什么我会得到2个不同的EventAggregator实例?
如何在整个应用程序中共享相同的EventAggregator实例?
提前致谢
问题是 MefBootstrapper 创建了一个 Container,但没有将其注册为 DEFAULT 容器。当调用 SatisfyImports 时,MEF 没有看到任何容器,因此它创建一个新容器。这就是实例不同的原因,因为正在创建 2 个不同的容器。要解决此问题,只需将 Prism 容器设置为 MEF 使用的默认容器即可。
Silverlight 解决方案(在您的引导程序中):
protected override void InitializeShell()
{
base.InitializeShell();
//Make the container the default one.
CompositionHost.Initialize(this.Container);
//Etc.
}
Run Code Online (Sandbox Code Playgroud)
WPF(桌面)解决方案:
目前,我无法使用桌面解决方案。问题是 MEFExportFactory<T>和ComponentInitializer只能用于 Silverlight 应用程序(为什么!?)。Glen Block 创建了一个库,可以访问该System.ComponentModel.Composition.Initialization.dll库的桌面版本。我尝试使用它,但它失败了,因为在代码中,如果容器已经存在,它就会失败......再说一遍,为什么?我还没有尝试将 MEF2(Codeplex 预览版)与此解决方案一起使用,但我想它会工作得更好(也许)。烦人的部分是,如果您选择使用 MEF2 (Codeplex),则必须重建 Prism 二进制文件,并将 .NET 4 MEF 库的所有引用替换为 Codeplex MEF2 库。这使得 Prism 能够毫无抱怨地使用 Codeplex MEF2 库。我将尝试看看这样做是否可以使该解决方案在 WPF 中可行。
| 归档时间: |
|
| 查看次数: |
1337 次 |
| 最近记录: |