WPF C# Ninject 与 mainViewModel 和多个 viewmodel 问题

Posted

技术标签:

【中文标题】WPF C# Ninject 与 mainViewModel 和多个 viewmodel 问题【英文标题】:WPF C# Ninject with a mainViewModel and multiple viewmodel problem 【发布时间】: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 组件。

【问题讨论】:

【参考方案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。但我似乎看不到课堂上的其他功能。

以上是关于WPF C# Ninject 与 mainViewModel 和多个 viewmodel 问题的主要内容,如果未能解决你的问题,请参考以下文章

无法让 Ninject 拦截与 WCF 一起使用

IAuthenticationFilter 中的 C# Ninject Web API 异步查询导致实体框架中的多个操作错误

带有 DataTemplate 的 ContentControl 不显示任何内容(WPF MVVM)

使用 WPF 和 Caliburn.Micro 在视图中添加多个视图

c#与wpf如何融合?

使用 Unity3D 进行 Ninject