【发布时间】:2011-04-30 04:25:57
【问题描述】:
我在我的应用程序周围使用可观察的集合。我的问题是,当我使用弹出窗口编辑这些实体时,当用户更改窗口中的相应字段时,我的绑定列表会发生变化。
我怎样才能简单地冻结可观察的更改通知,并仅在保存实体时才释放它们?
谢谢, 奥兰
【问题讨论】:
标签: wpf wpf-controls binding
我在我的应用程序周围使用可观察的集合。我的问题是,当我使用弹出窗口编辑这些实体时,当用户更改窗口中的相应字段时,我的绑定列表会发生变化。
我怎样才能简单地冻结可观察的更改通知,并仅在保存实体时才释放它们?
谢谢, 奥兰
【问题讨论】:
标签: wpf wpf-controls binding
你可以使用:
BoundPropertyOfViewModel = CollectionViewSource.GetDefaultView(AgentDeploymentDetail);
并绑定到视图而不是直接绑定到 ObservableCollection。这是同一个对象,允许您在不接触集合的情况下对输出进行过滤/排序。
如果您想停止更改,请使用DeferRefresh()。完成后,请致电Refresh()。
警告
这不会妨碍显示每个项目本身的变化,只会显示列表。
【讨论】:
PropertyChanged通知,这会反映在view中...
您可以为要编辑的对象创建一个deep copy。这样,您可以在编辑时对副本进行操作,而不会干扰列表中保留的原件。完成编辑后,您可以将原始版本替换为编辑后的版本或回滚。
【讨论】:
我认为问题不在于集合,而在于实体本身。 ObservableCollection 在添加或删除项目时引发事件,而不是在更改项目的属性时引发事件。这部分由item实现的INotifyPropertyChanged处理,所以需要禁用这个通知。
我建议你看看IEditableObject 接口,它是为这种场景设计的。您可以在BeginEdit 方法中禁用通知,并在EndEdit 和CancelEdit 中重新启用它们。
编辑:Paul Stovell 在这里很好地实现了 IEditableObject 包装器:
http://www.paulstovell.com/editable-object-adapter
【讨论】:
以上所有答案都很棒。但我找到了一个很好且方便的程序,以高效和干净的方式执行所需的操作。它基于使用 Matthieu MEZIL 实体克隆器 (http://msmvps.com/blogs/matthieu/archive/2008/05/31/entity-cloner.aspx) 对分离的对象执行深层复制。
欲知详情,请查看以下内容:Entity Framework Attach Exception After Clone
感谢大家的大力支持...
【讨论】: