我在我的应用程序周围使用可观察的集合。我的问题是,当我使用弹出窗口编辑这些实体时,当用户更改窗口中的相应字段时,我的绑定列表会发生变化。
我怎样才能简单地冻结可观察的变更规范,并仅在保存实体时才释放它们?
谢谢, 奥兰
答案 0 :(得分:5)
我认为问题不在于收藏,而在于实体本身。 ObservableCollection
在添加或删除项目时引发事件,而不是在项目的属性发生更改时引发。此部分由项目实施的INotifyPropertyChanged
处理,因此您需要禁用此通知。
我建议您查看专为此类场景设计的IEditableObject
界面。您可以在BeginEdit
方法中停用通知,并在EndEdit
和CancelEdit
中重新启用它们。
编辑:Paul Stovell在这里有一个很好的IEditableObject
包装器实现:
http://www.paulstovell.com/editable-object-adapter
答案 1 :(得分:3)
您可以使用:
BoundPropertyOfViewModel = CollectionViewSource.GetDefaultView(AgentDeploymentDetail);
并绑定到视图而不是直接绑定到ObservableCollection。这个对象允许您在不触及集合的情况下对输出进行过滤/排序。
如果要停止更改,请使用DeferRefresh()
。完成后,请致电Refresh()
。
警告强>
这不会影响每个项目本身的变化,只显示列表。
答案 2 :(得分:2)
您可以制作要编辑的对象的deep copy。这样,您可以在编辑时对副本执行操作,而不会干扰列表中保留的原始文件。完成编辑后,您可以通过编辑的版本或回滚替换原始文件。
答案 3 :(得分:0)
上面的所有答案都很棒。但是我找到了一个很好的,有意义的,以高效和干净的方式完成所需的工作。它基于使用Matthieu MEZIL实体克隆器(http://msmvps.com/blogs/matthieu/archive/2008/05/31/entity-cloner.aspx)对分离的对象执行深层复制。
有关详细信息,请查看以下内容:Entity Framework Attach Exception After Clone
感谢所有人的大力支持......