【问题标题】:communicate from one ViewModel to Another从一个 ViewModel 到另一个 ViewModel 通信
【发布时间】:2014-06-02 07:54:48
【问题描述】:

I have a ProductCategoryViewModel in which I have a treeView Control which I bind to a collection in my viewModel,On the treeView control has one Context Menu .When the Context menu is selected I open another window ,on the window has One Textbox和两个按钮,确定和取消,在这里用户可以在文本框中输入一个类别名称,当点击确定时我想将类别添加到数据库中,我还想关闭窗口并填充 ProductCategoryViewModel 的 CategoryCollection(以反映更改)这些是我的要求。

我的问题是:

1-我需要为新窗口创建一个单独的视图模型,并编写将类别添加到数据库中的代码,还是只为按钮创建一个字符串属性和两个命令,确定并在我的 ProductCategoryViewModel 中取消,然后编写在那里插入逻辑, 当 Ok 命令调用时。

2-如果我为 Window 创建一个新的 ViewModel,我如何与我的 ProductCategoryViewModel 进行通信(以刷新 CategoryCollection )。

【问题讨论】:

  • 新窗口 - 新虚拟机。要进行通信,请传递实例(在新窗口 vm 构造函数中)。
  • 你能分享一些你到目前为止所做的代码吗,从描述中得到图片并不难。

标签: c# wpf mvvm treeview


【解决方案1】:
  1. 完全取决于您。我不会写逻辑来实现 在我的视图模型中插入数据库,但也许让一个较低的级别 专门的工作人员为您处理(也许可以查看Repository Pattern

  2. 我在使用来自PrismEventAggregator 方面有很好的经验。注册EventAggregator 很简单 ViewModel 并调用您的事件(在您的示例中,它将是 添加到CatergoryCollection:

    //Subscribe
    eventAggregator.GetEvent<CategoryUpdated>().Subscribe(ExitMethod);
    
    // Publish
    eventAggregator.GetEvent<CategoryUpdated>().Publish();
    

【讨论】:

    【解决方案2】:

    从评论开始,并不断发展......所以我们开始吧:

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

    2. 话虽如此,如果您使用的是框架(如 mvvm-light),他们通常有专门的信使。

    3. 看看我的big mvvm template。您可以从那里轻松选择所需内容,并了解如何使用 messenger 类。

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

    我确定我在 codeproject 上也看到了 MVVM 的弹出式实现...也许您也应该看看...

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-19
        • 1970-01-01
        • 1970-01-01
        • 2022-11-25
        相关资源
        最近更新 更多