我正在尝试在我的应用程序中的新项目上使用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控制它,因此导出和导入工作?
目前他们没有,这就是为什么我试图理解这一切:)
答案 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类。