【问题标题】:Ninject InSingletonScope() view model isn't assigned to a view at bindingNinject InSingletonScope() 视图模型在绑定时未分配给视图
【发布时间】:2011-12-19 03:57:43
【问题描述】:

我假设当我在 NinjectModule 中绑定时

Bind<SplashViewModel>().ToSelf().InSingletonScope();

SplashViewModel 的一个实例被缓存在 Ninject 内核中,每次我调用kernel.Get&lt;SplashViewModel&gt; 时,我都会得到相同的视图模型实例返回给我。这就是发生的事情,真的。

在我的NinjectUIModule 我打电话:

Bind<SplashViewModel>().ToSelf().InSingletonScope();
Bind<SplashWindow>().ToMethod(context => new SplashWindow()
                                                       {
                                                           DataContext = new SplashViewModel()
                                                       });

问题在于SplashWindow 获得了一个不同的SplashViewModel 新实例,而不是缓存在Ninject 内核中并返回给所有其他检索方的实例。

如何在 Ninject 模块中将视图模型绑定到视图的 DataContext,并允许它通过内核返回。稍后获取应用程序中的其他代码。

【问题讨论】:

    标签: .net mvvm inversion-of-control ninject


    【解决方案1】:

    如果您的 SplashWindow 将 SplashViewModel 作为 ctor arg,那么 Ninject 会为您处理初始化。您甚至不需要定义 SplashWindow 绑定。

    【讨论】:

    • 要么这样做,要么将 [Inject] 属性放在 SplashWindow 中的 DataContext 属性上。然后只需使您的 SplashWindow 绑定成为正常的自绑定。
    【解决方案2】:

    我已经通过以下绑定方法解决了这个问题:

    class NinjectUIModule: NinjectModule
        {
            public override void Load()
            {
                Bind<SplashViewModel>().ToSelf().InSingletonScope();
                Bind<SplashWindow>().ToMethod(context => new SplashWindow()
                                                             {
                                                                DataContext = Kernel.Get<SplashViewModel>()
                                                             });
            }
        }
    

    我不确定这是否是完美的解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多