1

我正在使用 Prism-MEF-WPF 有时我需要从视图的 XAML 构造视图模型,因此不涉及容器并且无法自动执行依赖注入(因为没有与 VM 一起使用的 Export 属性) .so Prism-WPF 中应该有一些类,如 CompositionInitializer,使我能够要求容器进行注入。如果有等效的类如何使用它,如果没有等效的如何从 xaml 构造视图模型知道我使用 MEF 的观点。提前致谢。

4

3 回答 3

1

问题是如果 XAML 没有无参数构造函数,则无法在 XAML 中创建对象。

使用 ServiceLocator,您可以实现这一点。它将作为 IoC 工作(由 Prism/MEF 设置,您只需删除 .dll):

xml:

<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
}
于 2013-01-28T17:20:46.227 回答
1

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

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

关于 CompositionInitializer 类,据我所知 WPF 没有等效类,另一方面,关于这个主题,我相信您会发现以下博客文章很有趣:

•<a href="http://reedcopsey.com/2010/03/26/mef-compositioninitializer-for-wpf/" rel="nofollow">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(this);

于 2013-01-29T05:47:40.707 回答
0

Bootstrapper类是您正在寻找的。它UnityContainer用于注入依赖项。此处的此链接也可能对您感兴趣..

编辑

如果我做对了,您想从您的 xaml 创建一个 ViewModel,可以这样实现(这里本地是您的 ViewModel 类的命名空间) -

<Window.DataContext>
    <local:ViewModel/>
</Window.DataContext>
于 2013-01-27T10:57:26.053 回答