我正在使用Prism-MEF-WPF,有时我需要从XAML构建视图模型 视图,所以容器不涉及,不能做依赖注入 自动(因为没有与VM一起使用的导出属性)。所以应该有一些 Prism-WPF中的类就像CompositionInitializer一样,让我可以问容器 做注射。如果有相同的类如何使用它,以防万一 知道我使用MEF,没有相当于如何从视图的xaml构造视图模型。 提前谢谢。
答案 0 :(得分:1)
问题是,如果XAML没有无参数构造函数,则无法在XAML中创建对象。
使用ServiceLocator,您可以实现此目的。它将作为IoC工作(由Prism / MEF设置,你只需要放弃.dll):
xaml:
<Window.DataContext>
<local:ViewModel/>
</Window.DataContext>
代码隐藏:
class ViewModel : NotificationObject
{
public ViewModel()
{
var firstDependency = ServiceLocator.Current.GetInstance<FirstDependencyType>();
//... more dependencies here instead of as constructor parameters
}
//class code omitted for brievity
}
答案 1 :(得分:1)
这是我从Agustin Adami“http://blogs.southworks.net/aadami”获得的正确答案:
根据我的理解,只有在视图模型没有任何构造函数参数的情况下,才能在XAML中将视图模型实例化为视图的DataContext。据我所知,目前不支持通过与Inverse of Control Container合作来创建在XAML中定义的对象。
关于CompositionInitializer类,据我所知,WPF没有等效的类,另一方面关于这个主题,我相信你可以找到以下博文有趣:
•http://reedcopsey.com/2010/03/26/mef-compositioninitializer-for-wpf/ 另外,我认为另一种方法是注册这个线程中提到的CompositionContainer类:
http://compositewpf.codeplex.com/discussions/311933 因为这可以让您在视图模型的构造函数中检索此类,以便调用SatisfyImportsOnce方法来满足传递的类中定义的Imports:
this.compositionContainer = ServiceLocator.Current.GetInstance(); this.compositionContainer.SatisfyImportsOnce(本);
答案 2 :(得分:0)
Bootstrapper课程就是你要找的。它使用UnityContainer
来注入依赖项。此链接here也可能是您感兴趣的..
修改强>
如果我做对了,你想从你的xaml创建一个ViewModel,这可以像这样实现(这里local是你的ViewModel类的命名空间) -
<Window.DataContext>
<local:ViewModel/>
</Window.DataContext>