【问题标题】:WPF ObservableCollection Edit ModeWPF ObservableCollection 编辑模式
【发布时间】:2011-04-30 04:25:57
【问题描述】:

我在我的应用程序周围使用可观察的集合。我的问题是,当我使用弹出窗口编辑这些实体时,当用户更改窗口中的相应字段时,我的绑定列表会发生变化。

我怎样才能简单地冻结可观察的更改通知,并仅在保存实体时才释放它们?

谢谢, 奥兰

【问题讨论】:

标签: wpf wpf-controls binding


【解决方案1】:

你可以使用:

  BoundPropertyOfViewModel = CollectionViewSource.GetDefaultView(AgentDeploymentDetail);

并绑定到视图而不是直接绑定到 ObservableCollection。这是同一个对象,允许您在不接触集合的情况下对输出进行过滤/排序。

如果您想停止更改,请使用DeferRefresh()。完成后,请致电Refresh()

警告

这不会妨碍显示每个项目本身的变化,只会显示列表。

【讨论】:

  • 当item被添加到collection或者从collection中移除时会阻止view刷新,但是不会阻止items自己提出PropertyChanged通知,这会反映在view中...
  • 是的,你是对的。我认为只有列表是这里的问题。我会更新我的答案。
  • 谢谢。我的主要目的是块编辑更改,而不是添加/删除更改。
【解决方案2】:

您可以为要编辑的对象创建一个deep copy。这样,您可以在编辑时对副本进行操作,而不会干扰列表中保留的原件。完成编辑后,您可以将原始版本替换为编辑后的版本或回滚。

【讨论】:

  • 谢谢。我之前尝试过这种方法,但是由于它使用嵌套对象的序列化,因此某些对象无法序列化,并且克隆的对象无法进一步完美使用。
  • @OrPaz :能够以一种或另一种方式备份您的对象,这可能被证明是至关重要的,特别是如果您考虑使用 Thomas 建议的 IEditableObject 接口。
  • 我已经尝试使用可用的序列化或实体克隆器来深度复制对象。虽然它有效,但我不能使用它们,因为它实际上需要将近 5(!)秒来执行复制....有什么建议吗? (在这里跟进一个新问题:stackoverflow.com/questions/4034477/…
  • 谢谢。您的回答使我找到了解决方案。我将在下面发布完整的详细信息。
【解决方案3】:

我认为问题不在于集合,而在于实体本身。 ObservableCollection 在添加或删除项目时引发事件,而不是在更改项目的属性时引发事件。这部分由item实现的INotifyPropertyChanged处理,所以需要禁用这个通知。

我建议你看看IEditableObject 接口,它是为这种场景设计的。您可以在BeginEdit 方法中禁用通知,并在EndEditCancelEdit 中重新启用它们。


编辑:Paul Stovell 在这里很好地实现了 IEditableObject 包装器: http://www.paulstovell.com/editable-object-adapter

【讨论】:

  • 谢谢。虽然我对这种方法感兴趣,但项目下载链接似乎已损坏。
【解决方案4】:

以上所有答案都很棒。但我找到了一个很好且方便的程序,以高效和干净的方式执行所需的操作。它基于使用 Matthieu MEZIL 实体克隆器 (http://msmvps.com/blogs/matthieu/archive/2008/05/31/entity-cloner.aspx) 对分离的对象执行深层复制。

欲知详情,请查看以下内容:Entity Framework Attach Exception After Clone

感谢大家的大力支持...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-08
    • 1970-01-01
    • 1970-01-01
    • 2014-03-26
    • 2011-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多