Mvvm 围绕MEF思考:如何加载视图(模型)?

Mvvm 围绕MEF思考:如何加载视图(模型)?,mvvm,prism,mef,loading,Mvvm,Prism,Mef,Loading,我正在学习使用MEF加载模块的prism V4。加载模块确实有效,但在一个模块中,我想加载一个视图/视图模型(MVVM),但不知道如何让MEF为我解决所有这些问题 首先:我需要如何标记ViewModel(我遵循StockTraderRI示例),以便它不会在启动时加载,而是可以在运行时加载到区域中 第二:如何使用MEF加载ViewModel,使其连接到相应的接口 MEF对启动时标记为[Export]的东西做得非常好,但我不知道如何在运行时实现这一点。您可以使用称为a的东西,以便在显式使用它之前不会

我正在学习使用MEF加载模块的prism V4。加载模块确实有效,但在一个模块中,我想加载一个视图/视图模型(MVVM),但不知道如何让MEF为我解决所有这些问题

首先:我需要如何标记ViewModel(我遵循StockTraderRI示例),以便它不会在启动时加载,而是可以在运行时加载到区域中

第二:如何使用MEF加载ViewModel,使其连接到相应的接口


MEF对启动时标记为[Export]的东西做得非常好,但我不知道如何在运行时实现这一点。

您可以使用称为a的东西,以便在显式使用它之前不会解析接口


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

[PartCreationPolicy(CreationPolicy.NonShared)]
[Export(typeof(ISomething)]
public class Something : ISomething { }
缺点是,现在无论您需要在哪里创建实例,都需要有对实际容器实例的引用。然后你可以做:

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

编辑:好吧,我想我更明白你在追求什么。我通常是这样解决这个问题的:

  • 我将视图对象实现为UserControl实例,不在其代码或XAML中的任何位置设置DataContext

  • 我创建了一个DataTemplate,它将ViewModel的类型绑定到UserControl

  • 在我的MainViewModel(或与承载区域的视图相对应的任何对象)上,我公开了一个通用的RegionX对象(如果我的所有ViewModel都将共享一些公共功能,但对象工作正常,则可能键入到一个接口)

  • 我创建内容绑定到RegionX属性的ContentPresenter

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


  • 我更多的是在寻找像MefMagic.Create这样的东西,它将创建所需的MyView?您希望创建相同类型的多个实例吗?不(至少还没有)。视图/视图模型应该被创建并以某种方式焊接在一起。正如我所说:当视图自动加载到适当的区域时,它就像魅力一样工作。现在我只想知道,当我想将其他视图/视图模型加载到某个区域时,如何手动完成此操作。@Sam,\u container是您在启动时创建的用于承载所有导出零件的CompositionContainer。这是该方法的不幸一面,因为现在需要传递容器。一种方法是创建一个静态主机类,应用程序的不同部分可以在其中访问容器。基本上,您回到了旧的服务定位器模式,有一个中心位置来请求实例。