WPF ObservableCollection 编辑模式

8

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

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

谢谢, Oran


请查看以下链接:http://stackoverflow.com/questions/2105830/editing-observablecollections-selecteditem-without-bound-controls-seeing-edits-u 和 https://dev59.com/N3VC5IYBdhLWcg3whRcw - Prince Ashitaka
4个回答

5
我认为问题不在于集合,而在于实体本身。当添加或删除项目时,ObservableCollection会引发事件,而不是当项目的属性更改时。这部分由项目实现的INotifyPropertyChanged处理,因此需要禁用此通知。
我建议您查看IEditableObject接口,该接口专为此类情况设计。您可以在BeginEdit方法中禁用通知,并在EndEditCancelEdit中重新启用它们。

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


谢谢。虽然我对那种方法很感兴趣,但是项目下载链接好像失效了。 - OrPaz

3

您可以使用:

  BoundPropertyOfViewModel = CollectionViewSource.GetDefaultView(AgentDeploymentDetail);

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

当您想要停止更改时,请使用DeferRefresh()。完成后,请调用Refresh()

警告

这不会阻止每个项目本身的更改显示,只会影响列表。


它将防止视图在向集合添加或删除项时刷新,但它不会阻止这些项引发自己的“PropertyChanged”通知,这些通知将反映在视图中... - Thomas Levesque
是的,你说得对。我以为只有列表是重点。我会更新我的答案。 - Aliostad
谢谢。我的主要目的是块编辑更改,而不是添加/删除更改。 - OrPaz

2
你可以制作一个深拷贝,以便编辑想要的对象。这样,在编辑时,您可以对副本进行操作,而不会干扰仍在列表中的原始对象。编辑完成后,您可以用编辑后的版本替换原始版本或回滚。

谢谢。我之前尝试过这种方法,但由于它使用了嵌套对象的序列化,一些对象无法被序列化,克隆的对象不能完美地继续使用。 - OrPaz
@OrPaz:能够以某种方式备份您的对象可能非常关键,特别是如果您考虑使用Thomas建议的IEditableObject接口。 - Matthieu
我已经尝试使用可用的序列化或实体克隆器来进行对象的深度复制。虽然它可以工作,但是由于实际上需要近5秒钟才能完成复制,所以我无法使用它们。有什么建议吗?(在这里提出了一个新问题:http://stackoverflow.com/questions/4034477/entity-framework-attach-exception-after-clone) - OrPaz
谢谢。你的回答带领我找到了解决方案。我会在下面发布完整的细节。 - OrPaz

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接