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