Prism-WPF相当于Silverlight的:CompositionInitializer类和SatisfyImports()

时间:2013-01-27 08:34:15

标签: wpf prism mef

我正在使用Prism-MEF-WPF,有时我需要从XAML构建视图模型 视图,所以容器不涉及,不能做依赖注入 自动(因为没有与VM一起使用的导出属性)。所以应该有一些 Prism-WPF中的类就像CompositionInitializer一样,让我可以问容器 做注射。如果有相同的类如何使用它,以防万一 知道我使用MEF,没有相当于如何从视图的xaml构造视图模型。 提前谢谢。

3 个答案:

答案 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>