【问题标题】:What is MVVM proper way to deal with “insertion”什么是 MVVM 处理“插入”的正确方法
【发布时间】:2012-02-13 05:02:39
【问题描述】:

这是我的要求(为了这个问题,我正在简化事情)。我有一个按名字和姓氏标识的人员列表。该列表存储在 XML 文件中。我需要构建由两个窗口组成的 WPF 应用程序:主窗口显示列表。没什么特别的,只是一个包含名字和姓氏的列表。 底部三个按钮:添加、编辑、删除。 单击删除按钮时,选定的行将从文件中永久删除。 单击添加或编辑按钮时,会弹出第二个窗口(一个对话框),您可以在其中分别输入新人的名字和姓氏,或修改和保留现有记录。

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

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

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

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

亨利

【问题讨论】:

    标签: c# wpf mvvm


    【解决方案1】:

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

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

    2/ 在 MVVM 中,所有功能代码都放在 ViewModel 中。这个Persist 按钮将触发一个命令,该命令调用 ViewModel 中的一个方法。一开始这有点令人困惑,并不像代码隐藏的“点击”那么简单,但从愚蠢的 View / MVVM 角度来看更有意义。它也更干净。

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

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

    这里有一些链接:

    【讨论】:

    • RE #2,我使用 RelayCommand 并将我的命令定义为 ViewModel 本身的属性。这使它不那么令人困惑,不需要那么多类,并允许访问其他 ViewModel 属性来启动。
    • @JoelCochran 确实——我并不是要暗示命令不在 ViewModel 中,只是它反过来调用 ViewModel 中的方法。在我的项目中,View 绑定的所有内容都在 ViewModel 中。
    猜你喜欢
    • 2013-11-08
    • 1970-01-01
    • 2015-02-11
    • 2014-09-23
    • 2010-10-08
    • 2013-07-24
    • 2011-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多