这是我的要求(我为了这个问题而简化了一些事情)。我有一个由名字和姓氏标识的人员名单。该列表存储在XML文件中。我需要构建包含两个窗口的WPF应用程序:主窗口显示列表。没什么好看的,只是一个名字和姓氏的列表。 底部有三个按钮:添加,编辑,删除。 单击“删除”按钮后,将从文件中永久删除所选行。 单击“添加”或“编辑”按钮时,将弹出第二个窗口(对话框),您可以通过键入名字和姓氏来分别输入新人,或修改并保留现有记录。
如何以适当的方式在MVVM中构建此应用程序?以下是我的具体问题:
1)从MVVM的角度来看,我不能直接绑定到XML数据源,或者我可以吗?所以我应该创建实现INotifyPropertyChange的对象Person,然后在ObservableCollection中存储一堆这样的对象。当我需要将更改保存回文件时,我需要编写读取XML文件并将其转换为对象集合的代码,反之亦然。我是对的吗?
2)在哪里可以将实际保存到XML文件中的“Persist”方法实现?调用此方法有两个位置:单击主窗口的“删除”按钮,或单击“添加/编辑”窗口的“确定”按钮。
3)请注意,同一个窗口处理Add和Edit,我该如何以适当的MVVM方式实现这个窗口?我如何分别显示该窗口的标题“添加”或“编辑”而不诉诸丑陋的if语句i代码?我绑定了两个文本框(名字和姓氏)。另请注意,“添加/编辑”窗口具有“确定”和“取消”按钮,在单击“确定”之前不会接受更改,如果单击“取消”,则必须放弃更改。我看到的一个可能的解决方案是克隆Person对象而不是直接绑定到同一个对象,因为list被绑定,这样在单击OK之前列表不会显示更改,但这很毛茸茸,因为我需要编写代码来回复制属性。在MVVM中有更好的方法吗?
提前谢谢
亨利
答案 0 :(得分:2)
要解决您的三个具体问题,
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可以在窗口关闭后调查该结果,然后确定要执行的操作(保存/放弃,编辑/添加,任何其他验证等)
以下是一些链接: