【问题标题】:Wrapping my mind around MEF: how to load View(Model)?围绕 MEF 思考:如何加载视图(模型)?
【发布时间】:2011-05-13 21:55:46
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: mvvm prism mef loading


    【解决方案1】:

    您可以使用所谓的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. 我创建了一个从 ViewModel 的类型绑定到 UserControl 的 DataTemplate。

    3. 在我的 MainViewModel(或与托管区域的视图相对应的任何东西)上,我公开了一个通用的 RegionX 对象(如果我的所有 ViewModel 都将共享一些通用功能,则可能键入到一个界面,但对象工作正常)。

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

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

    【讨论】:

    • 我更多的是寻找像 MefMagic.Create 这样可以创建所需的 MyView 的东西?
    • 您是否希望创建多个相同类型的实例?
    • 没有(至少现在还没有)。应该创建 View/ViewModel 并以某种方式焊接在一起。
    • 正如我所说:当视图自动加载到适当的区域时,它就像魅力一样。现在我只想知道当我想将其他视图/视图模型加载到某个区域时如何手动完成。
    • @Sam,_container 是您在启动时创建的 CompositionContainer,用于托管所有导出的部件。这是该方法的不幸方面,因为现在您需要传递您的容器。一种方法是创建一个静态主机类,应用程序的不同部分可以在其中访问容器。基本上你回到了旧的服务定位器模式,有一个中心位置来请求实例。
    猜你喜欢
    • 2020-09-27
    • 2017-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-25
    • 2012-01-07
    • 1970-01-01
    相关资源
    最近更新 更多