首页 > 解决方案 > WPF C# Ninject 与 mainViewModel 和多个 viewmodel 问题

问题描述

我在我的应用程序中实现 ninject 时遇到问题。

我的应用程序包含 MainView 视图和视图模型。MainView 使用 resource.xaml 来绘制 GUI。我还在 MainView.xaml 中为每个资源绑定视图模型。

我在实施 Ninject 时遇到问题。

在我正在创建的 MainViewModel 中;

    public logViewModel ChangelogViewModel { get; set; } = new logViewModel();
    public TabViewModel ToolTabViewModel { get; set; } = new ToolTabViewModel();

我将其作为资源文件的视图模型内容发送。如何使用 ninject 自动创建这些额外的视图模型?

我也有使用内核绑定接口的问题。当我的构造函数启动时,我没有从 ninject 内核绑定中获取函数。

似乎在运行时检查构造函数时,它只获取我的连接字符串,它是视图模型中的私有变量。但我的功能不在那里。

        Bind<IDataAccessor>().To<DataAccessor>().InSingletonScope().WithConstructorArgument("connectionString", connectionString);

另一个奇怪的事情是,当我的访问器被调用时,它似乎并没有运行它的功能。部分课程与此有关吗?

我正在使用 Telerik 组件。

标签: c#wpf

解决方案


像大多数 DI 容器一样,Ninject 使用构造函数注入。当类/视图模型构造函数请求特定接口时,您告诉它要创建什么。

当您获取该类的实例时,它会提供您注册的参数。

一个快速而肮脏的风味示例。

我不只是一个 starturl,而是调用 startup 来显示主窗口。

    private void Application_Startup(object sender, StartupEventArgs e)
    {
        var nj = new StandardKernel();
        nj.Bind<IVMOne>().To<VMOne>().InTransientScope();

        MainWindow mw = new MainWindow();
        mw.DataContext = nj.Get<MainWindowViewModel>();
        mw.Show();
    }

在这里,我说当我要求 IVMOne 时,然后给我一个 VMONe。MainWindowViewModel 想要一个 IVMOne 作为它的 ctor。所以当我得到一个主窗口视图模型时,ninject 也给了我一个 VMOne。

class MainWindowViewModel
{
    public IVMOne VMOne { get; set; }
    public MainWindowViewModel(IVMOne vmOne)
    {
        VMOne = vmOne;
    }
}

然后我可以绑定到:

    Title="MainWindow" Height="450" Width="800">
<Grid>
    <TextBlock Text="{Binding VMOne.Hello}"/>
</Grid>

推荐阅读