2010-10-25 67 views
8

我在我的应用程序中使用了observable集合。我的问题是,当我使用弹出窗口来编辑这些实体时,当用户更改窗口中的相应字段时,绑定列表将发生更改。WPF ObservableCollection编辑模式

我怎么能简单地冻结可观察到的变化规范,并且只在实体保存时才释放它们?

感谢, 奥兰

+0

请检查http://stackoverflow.com/questions/2105830/editing-observablecollections-selecteditem-没有绑定控件 - 看到编辑 - ühttp://stackoverflow.com/questions/269073/observablecollection-that-also-monitors-changes-on-the-elements-in-collection – 2010-10-25 12:13:07

回答

2

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

+0

谢谢。我之前已经尝试过这种方法,但是因为它使用嵌套对象的序列化,所以一些对象不能被序列化,并且克隆的对象不能被完全使用。 – OrPaz 2010-10-25 13:15:53

+0

@OrPaz:能够以某种方式备份对象,可能证明是非常重要的,特别是如果您考虑使用Thomas建议的IEditableObject接口。 – Matthieu 2010-10-25 14:22:31

+0

我已经尝试使用序列化或实体克隆可用来深度复制对象。虽然它的工作原理,我不能使用它们,因为它实际上需要近5(!)秒来执行副本....任何建议? (在这里跟进了一个新问题:http://stackoverflow.com/questions/4034477/entity-framework-attach-exception-after-clone) – OrPaz 2010-10-27 15:48:53

3

您可以使用:

BoundPropertyOfViewModel = CollectionViewSource.GetDefaultView(AgentDeploymentDetail); 

并绑定到视图,而不是直接绑定到的ObservableCollection。这是相同的对象,可以在不触摸集合的情况下过滤/排序输出。

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

警告

这将在每个项目本身,只有列表中的变化并不pervent表现。

+0

这将阻止视图刷新当项目被添加到集合中或从集合中删除时,但它不会阻止项目引发自己的'PropertyChanged'通知,这些通知将反映在视图中... – 2010-10-25 12:29:14

+0

你是对的。我认为只有列表是这里的问题。我会更新我的答案。 – Aliostad 2010-10-25 12:35:04

+0

谢谢。我的主要目的是块编辑更改,而不是添加/删除更改。 – OrPaz 2010-10-25 13:18:11

5

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

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


编辑:保罗Stovell有一个很好的实现了IEditableObject包装这里:以上 http://www.paulstovell.com/editable-object-adapter

+0

谢谢。尽管我对这种方法很感兴趣,但项目下载链接似乎已被打破。 – OrPaz 2010-10-25 13:42:31