什么是MVVM正确的方式来处理“插入”

问题描述:

这是我的要求(为了这个问题,我简化了一些东西)。我有一个由名字和姓氏标识的人员名单。该列表存储在XML文件中。我需要构建由两个窗口组成的WPF应用程序:主窗口显示列表。没有什么奇特的,只是名字和姓氏的列表。 底部的三个按钮:添加,编辑,删除。 当删除按钮被点击时,选定的行将从文件中永久删除。 单击添加或编辑按钮时,会弹出第二个窗口(一个对话框),您可以通过键入她的名字和姓氏分别输入新人或修改并保留现有记录。什么是MVVM正确的方式来处理“插入”

如何以适当的方式在MVVM中构建此应用程序?这里是我的具体问题:

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

2)我在哪里把“Persist”方法的实现保存到XML文件中?有两个地方将调用此方法:单击主窗口的删除按钮,或单击添加/编辑窗口的确定按钮。 3)请注意,相同的窗口处理添加和编辑,我如何以适当的MVVM方式实现此窗口?我如何显示窗口的标题“添加”或“编辑”,而不诉诸丑陋,如果我后面的代码语句?我将两个文本框绑定在一起(名字和姓氏)。另请注意,“添加/编辑”窗口中有“确定”和“取消”按钮,直到单击“确定”后才会接受更改,如果单击“取消”,则必须丢弃更改。我看到的一种可能的解决方案是克隆Person对象,而不是直接绑定到同一个对象,因为列表是绑定的,所以列表不显示更改,直到单击确定,但这很有毛病,因为我需要编写代码来复制属性来回。 MVVM中有更好的方法吗?
预先感谢

亨利

为了解决您的三个具体问题,

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

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

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

此外,'编辑/添加'窗口可以返回一个结果,父窗口可以调查窗口关闭后的结果,然后确定要做什么(保存/放弃,编辑/添加,任何其他验证等)。

这里有一些链接:

+0

RE#2,我使用RelayCommand并将我的命令定义为ViewModel本身内的属性。这使得它不那么容易混淆,不需要尽可能多的类,并允许访问其他ViewModel属性来引导。 – 2012-02-13 18:00:43

+0

@JoelCochran事实上 - 我的意思并不是暗示命令不在ViewModel中,而是在ViewModel中调用方法。在我的项目中,视图绑定的所有内容都在ViewModel中。 – 2012-02-13 22:26:59