【问题标题】:WPF C# Ninject with a mainViewModel and multiple viewmodel problemWPF C# Ninject 与 mainViewModel 和多个 viewmodel 问题
【发布时间】:2018-12-11 18:35:00
【问题描述】:

在我的应用程序中实现 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


    【解决方案1】:

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

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

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

    我调用启动来显示主窗口,而不仅仅是一个 starturl。

        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。 所以当我得到一个 mainwindowviewmodel 时,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>
    

    【讨论】:

    • 您好朋友,非常感谢您的回复。我做过和你一样的事情。假设在数据访问项目中,我设法设置 WithConstructorArgument 并将其绑定到数据访问访问器中的构造函数中的字符串变量。 nj.Bind().To().InTransientScope();然后我试图在我的视图模型中得到这个,但它不起作用。我只得到私有变量字符串 connectionString,而不是我的所有函数。
    • 其他视图模型该怎么办?就像我是一种上帝的部分类视图模型,比如 mainview xaml 通过“内容”参数发送视图模型,我指定它应该使用的资源模板 xaml。
    • public MainViewModel(CategoryViewModel categoryViewModel , ICategoryAccessor categoryAccessor ) { _categoryViewModel = categoryViewModel ; _categoryAccessor = categoryAccessor ;当我检查 CategoryAccessor 时,我只能找到我声明为静态成员的私有字符串。我的函数不在构造函数中...
    • 您假设我完全了解 categoryaccessor 是什么以及您的期望。而且您还在 cmets 中提出了更多问题。如果某些东西期望注入另一个对象,您只需将其绑定以定义应该是什么。我认为您也可以在 ctor 中创建一个类,当您获取时它会实例化其中一个。
    • 我现在看到我的绑定至少在 .WithConstructorArgument("connectionString", connectionString) 上有效,因为我可以看到构造函数中的字符串 connectionString。但我似乎看不到课堂上的其他功能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多