0

我正在尝试在我的应用程序中的一个新项目中使用 MEF。事情在主应用程序级别工作,但在这个单独的项目中,其程序集包含在主应用程序中(它的用户控件)我想知道一些事情......如果我有一个用户控件,并且其中我有以下内容:

  <UserControl.Resources>
      <DataTemplate DataType="{x:Type vm:MyViewModel}" >
          <local:MyView />
      </DataTemplate>
  </UserControl.Resources>
  <vm:MyViewModel />

在我的 MyViewModel 中,我导出了一些东西,并且程序集似乎组合得很好(我使用 CompositionInfoTextFormatter 来检查这一点)。但是我的虚拟机没有被 MEF 实例化,或者至少构造函数永远不会被调用。当它被调用时,它似乎来自 WPF 框架,而不是 MEF。

什么是正确的方法 A)在 xaml 中,将我的 VM 与其视图与 MEF 相关联(如果与上面不同)和 B)我如何实例化我的 VM 以便 MEF 控制它,因此导出和导入工作?

目前他们没有,这就是为什么我试图理解这一切:)

4

2 回答 2

3

鉴于您在上面显示的内容,MEF 在这里根本没有发挥作用。你有一个完全独立的用户控件。

事实上,您展示的 UserControl 可以做得更简单:

这和你上面写的差不多。这个 UserControl 确实没有理由存在,因为您可以直接放入MyView


话虽如此,我个人使用 MEF 来生成 DataTemplate。我处理它的方式是我有一个导出 a 的类ResourceDictionary,并让主应用程序导入ResourceDictionary并与主应用程序资源合并。

我使用这个导出类来导出从每个视图映射到相应视图模型的 DataTemplate。这非常有效,因为它允许一个完整的 VM-first 方法,而无需了解来自任何 VM 的视图。


编辑:

听起来您的问题是[Import]s 没有被填充,因为您使用 WPF 而不是 MEF 进行构造。如果是这种情况,您将需要使用此处提供的 PartInitializer 类。有关详细信息,请参阅Glenn Block 的博客

于 2010-02-11T19:05:00.820 回答
0

您可以查看WPF 应用程序框架 (WAF)的示例应用程序。它们展示了如何使用 MEF 来实例化 ViewModel 类。

于 2010-07-30T19:03:54.660 回答