围绕MEF缠绕我的想法:如何加载View(Model)?

时间:2010-11-22 15:21:42

标签: mvvm prism mef loading

我正在学习使用MEF加载模块的棱镜V4。加载模块确实有效,但是在一个模块中我想加载一个View / ViewModel(MVVM)并且我不知道如何让MEF为我解决所有这些问题。

首先:我如何标记ViewModel(我遵循StockTraderRI示例),因此它不会在启动时加载,而是可以在运行时加载到某个区域?

第二:如何使用MEF加载ViewModel,以便它连接到相应的接口?

MEF非常适合在启动时标记为[导出]的内容,但我不知道如何在运行时实现这一点。

1 个答案:

答案 0 :(得分:2)

您可以使用所谓的Lazy Export,以便在明确使用界面之前不会解析界面。


如果您需要创建多个实例,MEF不会特别支持这一点。您可以自己进行发现和实例化,也可以像这样定义导出:

[PartCreationPolicy(CreationPolicy.NonShared)]
[Export(typeof(ISomething)]
public class Something : ISomething { }

缺点是,现在无论您需要创建实例,都需要引用实际的Container实例。然后你可以这样做:

var something = _container.GetExportedObject<ISomething>();

编辑:好的,我想我更清楚你所追求的是什么。以下是我通常解决此问题的方法:

  1. 我将View对象实现为UserControl实例,并且不在其代码或XAML中的任何位置设置DataContext。

  2. 我创建了一个DataTemplate,它从ViewModel的Type绑定到UserControl。

  3. 在我的MainViewModel(或与托管区域的View对应的任何内容)上,我公开了一个通用的RegionX对象(如果我的所有ViewModel都将共享一些常用功能,可能会输入到接口,但Object工作正常)。

  4. 我创建了一个ContentPresenter,其内容绑定到RegionX属性。

  5. 现在,我的MainViewModel可以导入与RegionX可能托管的ViewModel类型相对应的不同ViewModel实例。当我想在区域中切换“活动”视图时,我只需将RegionX设置为相应的ViewModel。