【问题标题】:Editing ObservableCollection's SelectedItem Without Bound Controls Seeing Edits Until They Are Saved在没有绑定控件的情况下编辑 ObservableCollection 选定项目 在保存之前查看编辑
【发布时间】:2010-01-20 23:23:15
【问题描述】:

我有一个包含ListView 和“编辑”按钮的视图。 ListView 的ItemSource 绑定到底层视图模型上的ObservableCollection<Account> 属性。它的SelectedItem 属性也绑定到视图模型。

单击编辑按钮时,现有视图模型会启动编辑视图/视图模型对(“编辑屏幕”),允许用户编辑当前选定的Account。要编辑的Account 由主视图模型的SelectedItem 属性决定。

问题:在编辑屏幕中所做的任何更改都会立即反映在另一个屏幕的ListView 中,甚至在单击编辑屏幕的“保存”按钮之前。为什么会发生这种情况是有道理的——Account 在其属性发生更改并且ListView 正在处理这些通知时引发属性更改事件。

期望结果:绑定控件(如ListView)应该只在点击“保存”后才能看到编辑屏幕的变化。

可能的解决方案

  • 在进行编辑时暂停帐户的属性更改通知。缺点:如果在编辑Account 实例时执行手动数据绑定更新,“进行中”更改将出现在ListView 上,即使这些更改尚未发出通知。此外,如果用户为相同的Account 启动第二个编辑窗口,他们将看到“进行中”的更改。想法被拒绝。
  • 让编辑屏幕视图模型将Account 实例包装在某种EditingAccount 类中,该类仅在调用Save() 时将对其所做的更改复制回原始Account。编辑屏幕应该负责促进这种包装,还是应该要求服务层来做?

您如何看待这些选项?遇到这个问题怎么解决?

【问题讨论】:

    标签: c# wcf data-binding collections


    【解决方案1】:

    我会选择第二个选项的某个版本。基本上这是MVVM 模式的变体,它被认为是执行WPF/Silverlight 代码的“正确”方式。基本上,每个“屏幕”(视图)都应该有一个 ModelView 对象,该对象包装模型并以特定于视图的格式公开模型,因此它完全可以满足视图的需要,而且没有更多。

    【讨论】:

    • 其实上面答案中的MVVM是微软文章的链接。但如果你搜索 MVVM 和 C#,你应该会得到不少。
    猜你喜欢
    • 1970-01-01
    • 2017-12-11
    • 2010-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-03
    • 2012-08-05
    • 2019-10-26
    相关资源
    最近更新 更多