如何在DataTemplate中使用MVVM和MEF?

时间:2010-02-11 18:49:27

标签: wpf mvvm datatemplate mef

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

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

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

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

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

2 个答案:

答案 0 :(得分:3)

鉴于你在上面展示的内容,MEF在这里根本不会发挥作用。你有一个完全独立的UserControl。

事实上,您展示的UserControl可以更简单地完成:

                                                           

这与你上面写的几乎完全一样。这个UserControl确实没有理由存在,因为你可以直接输入MyView


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

我使用此导出类导出从每个View映射到相应ViewModel的DataTemplate。这非常有效,因为它允许完全基于VM的方法,而不了解任何VM的View。


编辑:

听起来你的问题是[Import]没有被填充,因为你正在使用WPF而不是MEF。如果是这种情况,您将需要使用PartInitializer class available here。有关详细信息,请参阅Glenn Block's blog

答案 1 :(得分:0)

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