Wpf 如何将MVVM和MEF与DataTemplate一起使用?

Wpf 如何将MVVM和MEF与DataTemplate一起使用?,wpf,mvvm,datatemplate,mef,Wpf,Mvvm,Datatemplate,Mef,我正在尝试在我的应用程序中的一个新项目上使用MEF。东西在主应用程序级别工作,但是在这个单独的项目中,其程序集包含在主应用程序中(它是一个用户控件),我想知道一些事情。。。如果我有一个UserControl,其中包含以下内容: <UserControl.Resources> <DataTemplate DataType="{x:Type vm:MyViewModel}" > <local:MyView /> &l

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

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

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

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


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

鉴于你上面所展示的,MEF在这里根本不起作用。您有一个完全独立的UserControl

事实上,您显示的用户控件可以做得更简单:

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


也就是说,我个人使用MEF生成数据模板。我处理它的方式是,我有一个类导出
ResourceDictionary
,让主应用程序导入
ResourceDictionary
,并将其与主应用程序资源合并

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


编辑:


听起来您的问题是没有填充
[Import]
s,因为您使用的是WPF而不是MEF进行构造。如果是这种情况,您将希望使用。有关详细信息,请参阅。

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

事实上,您显示的用户控件可以做得更简单:

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


也就是说,我个人使用MEF生成数据模板。我处理它的方式是,我有一个类导出
ResourceDictionary
,让主应用程序导入
ResourceDictionary
,并将其与主应用程序资源合并

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


编辑:


听起来您的问题是没有填充
[Import]
s,因为您使用的是WPF而不是MEF进行构造。如果是这种情况,您将希望使用。有关详细信息,请参阅。

您可以查看的示例应用程序。它们显示了如何使用MEF来实例化ViewModel类。

您可以看看的示例应用程序。它们显示了如何使用MEF来实例化ViewModel类。

我不明白的是,我的ViewModels中有导出和导入,但它们没有正确设置-我猜是因为MEF没有实例化这些,所以WPF没有。我所有的数据模板主要也在ResourceDictionary中,但目前它与MEF无关。底线是我的导入/导出不起作用,我不知道为什么。是-导入仅在MEF构成对象时导入。如果WPF正在编写而不是MEF,则需要让构造函数处理此问题。Glenn Block的PartInitializer非常适合(我使用它)。我会编辑回答…非常感谢里德,非常好的信息。因此,在示例docs frim Glenn中,我看到他在用户控件中使用PartInitializer。您是否也这样做,然后让ResourceDictionary导出datatemplate信息?因此,viewmodel本身中没有partinitializer是我想要的。好吧,我的视图是0代码落后的(除了资源导出)。因此,我在VM中使用PI,并导出ResourceDictionaries for DataTemplates来处理视图构造。这将是非常重要的,但如果您可以使用PI发布来自某个VM构造函数的代码片段,并演示如何使用资源字典,这将为我节省大量时间。不过只是一个请求:)对于RD我的主应用程序已经包含了数据模板。所以你要做的是把RD拉到一个单独的类中,导出它,让它由MEF组成,然后将它与你的主应用程序合并?如何在资源字典中导出数据模板?对不起,所有的问题,但这是我现在的新领域:)我不明白的是,我有出口和进口在我的ViewModels,但他们没有被正确设置-我猜是因为MEF没有实例化这些,WPF是。我所有的数据模板主要也在ResourceDictionary中,但目前它与MEF无关。底线是我的导入/导出不起作用,我不知道为什么。是-导入仅在MEF构成对象时导入。如果WPF正在编写而不是MEF,则需要让构造函数处理此问题。Glenn Block的PartInitializer非常适合(我使用它)。我会编辑回答…非常感谢里德,非常好的信息。因此,在示例docs frim Glenn中,我看到他在用户控件中使用PartInitializer。是th吗