我正在学习使用MEF加载模块的棱镜V4。加载模块确实有效,但是在一个模块中我想加载一个View / ViewModel(MVVM)并且我不知道如何让MEF为我解决所有这些问题。
首先:我如何标记ViewModel(我遵循StockTraderRI示例),因此它不会在启动时加载,而是可以在运行时加载到某个区域?
第二:如何使用MEF加载ViewModel,以便它连接到相应的接口?
MEF非常适合在启动时标记为[导出]的内容,但我不知道如何在运行时实现这一点。
答案 0 :(得分:2)
您可以使用所谓的Lazy Export,以便在明确使用界面之前不会解析界面。
如果您需要创建多个实例,MEF不会特别支持这一点。您可以自己进行发现和实例化,也可以像这样定义导出:
[PartCreationPolicy(CreationPolicy.NonShared)]
[Export(typeof(ISomething)]
public class Something : ISomething { }
缺点是,现在无论您需要创建实例,都需要引用实际的Container实例。然后你可以这样做:
var something = _container.GetExportedObject<ISomething>();
我将View对象实现为UserControl实例,并且不在其代码或XAML中的任何位置设置DataContext。
我创建了一个DataTemplate,它从ViewModel的Type绑定到UserControl。
在我的MainViewModel(或与托管区域的View对应的任何内容)上,我公开了一个通用的RegionX对象(如果我的所有ViewModel都将共享一些常用功能,可能会输入到接口,但Object工作正常)。
我创建了一个ContentPresenter,其内容绑定到RegionX属性。
现在,我的MainViewModel可以导入与RegionX可能托管的ViewModel类型相对应的不同ViewModel实例。当我想在区域中切换“活动”视图时,我只需将RegionX设置为相应的ViewModel。