c# – 什么是MVVM处理“插入”的正确方法

这是我的要求(我为了这个问题简化了一些事情).我有一个由名字和姓氏标识的人员名单.该列表存储在
XML文件中.我需要构建包含两个窗口的WPF应用程序:主窗口显示列表.没什么好看的,只是一个名字和姓氏的列表.

底部有三个按钮:添加,编辑,删除.

单击“删除”按钮后,将从文件中永久删除所选行.

单击“添加”或“编辑”按钮时,将弹出第二个窗口(对话框),您可以通过键入名字和姓氏来分别输入新人,或修改并保留现有记录.

如何在MVVM中正确构建此应用程序?以下是我的具体问题:

1)从MVVM的角度来看,我不能直接绑定到XML数据源,或者我可以吗?所以我应该创建实现INotifyPropertyChange的对象Person,然后在ObservableCollection中存储一堆这样的对象.当我需要将更改保存回文件时,我需要编写读取XML文件并将其转换为对象集合的代码,反之亦然.我是对的?

2)在哪里可以将实际保存到XML文件中的“Persist”方法实现?调用此方法有两个位置:单击主窗口的“删除”按钮,或单击“添加/编辑”窗口的“确定”按钮.

3)请注意,同一窗口处理添加和编辑,我如何以适当的MVVM方式实现此窗口?我如何分别显示该窗口的标题“添加”或“编辑”而不诉诸丑陋的if语句i代码?我绑定了两个文本框(名字和姓氏).另请注意,“添加/编辑”窗口具有“确定”和“取消”按钮,在单击“确定”之前不会接受更改,如果单击“取消”,则必须放弃更改.我看到的一个可能的解决方案是克隆Person对象而不是直接绑定到同一个对象,因为list被绑定,这样在单击OK之前列表不会显示更改,但这很毛茸茸,因为我需要编写代码来回复制属性.在MVVM中有更好的方法吗?
预先感谢

亨利

最佳答案 要解决您的三个具体问题,

1 /如果您的View直接绑定到XML,那么这不是MVVM. MVVM模式会将View绑定到呈现XML的ViewModel.如果您不需要更改XML,那么直接绑定就没有问题,但是因为您要从XML中添加/编辑/删除值,所以让ViewModel控制该交互是有意义的.我确实会创建一个实现INotifyPropertyChanged的Person对象.

2 /在MVVM中,所有功能代码都在ViewModel中.这个Persist按钮将触发一个Command,它调用ViewModel中的方法.这有点令人困惑,并不像代码隐藏’点击’那么简单,但从愚蠢的View / MVVM角度来看更有意义.它也更清洁.

3 /“编辑”屏幕将绑定到Person对象,并将触发Save命令.然后,此命令应执行适当的逻辑,确定它是新记录(插入)还是现有(更新)记录.如果对象是新的,则父ViewModel(您将需要集合的ViewModel而不仅仅是ObservableCollection)需要捕获该事件并将新对象添加到集合中.

此外,“编辑/添加”窗口可以返回结果,并且父ViewModel可以在窗口关闭后调查该结果,然后确定要执行的操作(保存/丢弃,编辑/添加,任何其他验证等).

以下是一些链接:

> The MVVM Pattern – 伟大的MSDN文章,用于MVVM介绍
> How to implement MVVM, ICommand etc – 实施ICommand
> MVVM Command Binding – 更多关于绑定到命令.

点赞