C# 从一个视图模型到另一个视图模型进行通信

C# 从一个视图模型到另一个视图模型进行通信,c#,wpf,mvvm,treeview,C#,Wpf,Mvvm,Treeview,我有一个ProductCategoryViewModel,其中有一个treeView控件,我绑定到我的viewModel中的一个集合,在treeView控件上有一个上下文菜单。选择上下文菜单后,我打开另一个窗口,窗口上有一个文本框和两个按钮,确定和取消,在这里,用户可以在文本框中输入一个类别名称,单击“确定”后,我想将该类别添加到数据库中,还想关闭窗口并填充ProductCategoryViewModel的CategoryCollection(以反映更改)。这些是我的要求 我的问题是: 1-我是

我有一个ProductCategoryViewModel,其中有一个treeView控件,我绑定到我的viewModel中的一个集合,在treeView控件上有一个上下文菜单。选择上下文菜单后,我打开另一个窗口,窗口上有一个文本框和两个按钮,确定和取消,在这里,用户可以在文本框中输入一个类别名称,单击“确定”后,我想将该类别添加到数据库中,还想关闭窗口并填充ProductCategoryViewModel的CategoryCollection(以反映更改)。这些是我的要求

我的问题是:

1-我是否需要为新窗口创建一个单独的viewModel,并编写代码将类别添加到数据库中,或者只为按钮创建一个字符串属性和两个命令,在我的ProductCategoryViewModel中创建ok和cancel,并在其中写入插入逻辑, 当Ok命令被调用时


2-如果我为窗口创建了一个新的视图模型,我如何与我的ProductCategoryViewModel进行通信(刷新CategoryCollection)。

以注释的形式开始,并不断增长……因此我们开始:

  • 这听起来不是问题,但更像是缺乏知识,可能不遵守网站的问题规则

  • 话虽如此,如果您使用的是框架(如mvvm light),他们通常会有一个专门的messenger

  • 看看我的表。您可以轻松地从中选择所需内容,并了解如何使用messenger类

  • 根据复杂性和您的范围,有时一个简单的hack(字符串和几个命令)是一个有效的选项

    我肯定我在codeproject上也看到了MVVM的弹出式实现…也许你也应该看看…

    可以帮助你开始:)。我宁愿采用第一种方法,因为它更容易为viewModel编写单元测试

  • 当然由你决定。我不会为实现 插入到我的viewmodel中的DB中,但可能允许使用较低级别 专门的工作人员为您处理(可能会查看

  • 我在使用from方面有很好的经验。只需在其中注册
    EventAggregator
    即可 ViewModel并调用您的事件(在您的示例中是 添加到
    类别集合

    //Subscribe
    eventAggregator.GetEvent<CategoryUpdated>().Subscribe(ExitMethod);
    
    // Publish
    eventAggregator.GetEvent<CategoryUpdated>().Publish();
    
    //订阅
    eventAggregator.GetEvent().Subscribe(ExitMethod);
    //发表
    eventAggregator.GetEvent().Publish();
    

  • 新窗口-新虚拟机。要进行通信,请传递实例(在新窗口虚拟机构造函数中)。您能分享一些代码吗?到目前为止,您所做的工作,从描述中了解情况并不困难。