我一直在使用我称之为 MV-MC (Model-View-ModelController) 的 MV-VM 风格开发一个非常大的 LOB 应用程序,它是 MVC 和 MV-VM 的一种组合。我已经发布了这个关于视图如何在 MV-VM 中实例化到问题“ what-are-the-most-common-mistakes-made-in-wpf-development ”的答案。
Sam对我的回答发表了以下评论:
这就产生了一个后续问题:您如何创建视图?我使用 RelayCommands 将视图中的动作绑定到 ViewModel,因此视图甚至不知道动作已经触发,也不知道他应该打开一个新视图。解决方案:在VM中创建一个事件供View订阅?
当我最初开始 MV-VM 开发时,我认为一切都应该存在于 ViewModel 中,并且研究了Josh Smith和Karl Shifflett等人的大量示例。但是,我还没有想出一个很好的例子来说明命令何时需要存在于 ViewModel 中。
例如,假设我有一个显示客户的 ListView,以及一个单击以允许我编辑当前选择的客户的按钮。ListView (View) 绑定到 CustomerVM (ViewModel)。单击该按钮会触发 EditCustomerCommand,它会打开一个弹出窗口,允许我编辑 CustomerVM 的所有属性。这个 EditCustomerCommand 在哪里?如果它涉及打开一个窗口(UI 功能),它不应该在视图的代码隐藏中定义吗?
有没有人有任何我应该在 View 和 ViewModel 中定义命令的示例?
马修赖特在下面陈述:
从列表中新建和删除将是很好的例子。在这些情况下,ViewModel 会添加一条空白记录或删除当前记录。视图采取的任何行动都应响应发生的这些事件。
所以如果我点击新按钮,会发生什么?CustomerVM 的新实例由 Parent ViewModel 创建并添加到它的集合中,对吗?那么如何打开我的编辑屏幕呢?视图应该创建 Customer ViewModel 的新实例,并将其传递给 ParentVM.Add(newlyCreatedVM) 方法,对吗?
假设我通过虚拟机上的 DeleteCommand 删除客户记录。VM 调用业务层并尝试删除记录。它不能,所以它会向虚拟机返回一条消息。我想在对话框中显示此消息。视图如何从命令操作中获取消息?