在WPF,Ninject和Caliburn.Micro中单击打开新窗口。

时间:2019-07-14 14:47:09

标签: wpf ninject caliburn.micro

我正在尝试建立一个WPF应用程序,以在菜单单击上调用新窗口,并将数据提供程序界面注入到新的视图模型中。

遵循了许多教程,并为Caliburn创建了Bootstrapper,它是ninject的服务定位器和模块。到目前为止,主视图不需要IDataProvider,但我想在click事件上打开一个新窗口。

引导程序:

public class Bootstrapper : BootstrapperBase
    {
        public Bootstrapper()
        {
            Initialize();
        }

        protected override void OnStartup(object sender, StartupEventArgs e)
        {
            DisplayRootViewFor<MainScreenViewModel>();
        }
    }

服务定位器和模块:

 public class ServiceLocator
    {
    private readonly IKernel _kernel;

        public ServiceLocator()
        {
            _kernel = new StandardKernel(new ServiceModule());
        }

        public MainScreenViewModel MainScreenViewModel => _kernel.Get<MainScreenViewModel>();

        public NewLayoutViewModel NewLayoutViewModel => _kernel.Get<NewLayoutViewModel>();
    }

 public class ServiceModule : NinjectModule
    {
        public override void Load()
        {
            Bind<ISqlite>().To<Sqlite>();
            Bind<IDataProvider>().To<DataProvider>();
        }
    }

这就是我被困住的地方:

    public class MainScreenViewModel : Conductor<object>
    {
        private IWindowManager _windowManager;

        public MainScreenViewModel()
        {
            _windowManager = new WindowManager();
        }

        public void NewLayout()
        {
            _windowManager.ShowWindow(new NewLayoutViewModel());
        }
    }

因为NewLayoutViewModel需要IDataProvider。

不确定,我还缺少什么,但是据我了解,Ninject应该为NewLayoutViewModel处理这个问题。

1 个答案:

答案 0 :(得分:0)

YouTube上从Tim Corey找到了一个很好的解决方案。

基本上,答案是,如果您不坚持使用Ninjet,请使用Caliburn.Micro的内置DI解决方案“ SimpleContainer”。