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

问题描述 投票:0回答:3

我正在使用 Prism-MEF-WPF,有时我需要从 XAML 构建视图模型 视图的,所以容器不参与,无法进行依赖注入 自动(因为没有与VM一起使用的导出属性)。所以应该有一些 Prism-WPF 中的类(如 CompositionInitializer)使我能够要求容器 进行注入。如果有等效的类如何使用它,并且如果有 知道我使用 MEF 后,没有等效的方法从视图的 xaml 构造视图模型。 预先感谢。

wpf prism mef
3个回答
1
投票

问题是,如果 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
投票

这是我从 Agustin Adami“http://blogs.southworks.net/aadami”得到的正确答案:

根据我的理解,仅当视图模型没有任何构造函数参数时,视图模型才能在 XAML 中实例化为视图的 DataContext。据我所知,目前不支持通过与反向控制容器合作来创建在 XAML 中定义的对象。

关于 CompositionInitializer 类,据我所知,WPF 没有等效的类,另一方面,关于这个主题,我相信您可能会对以下博客文章感兴趣:

https://web.archive.org/web/20230128075959/http://reedcopsey.com/2010/03/26/mef-compositioninitializer-for-wpf/ 另外,我相信另一种方法可以是注册 CompositionContainer 类,如本线程中提到的:

http://compositewpf.codeplex.com/discussions/311933 因为这可以让您在视图模型的构造函数中检索此类,以便调用 SatisfyImportsOnce 方法来满足传递的类中定义的导入:

this.compositionContainer =ServiceLocator.Current.GetInstance(); this.compositionContainer.SatisfyImportsOnce(this);


0
投票

Bootstrapper 类就是您正在寻找的。它使用

UnityContainer
来注入依赖项。此链接此处可能也会引起您的兴趣..

编辑

如果我说得对,你想从你的xaml创建一个ViewModel,可以像这样实现(这里local是你的ViewModel类的命名空间)-

<Window.DataContext>
    <local:ViewModel/>
</Window.DataContext>
© www.soinside.com 2019 - 2024. All rights reserved.