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