如果您在BeginEdit
调用时查看调试器中的堆栈跟踪,您会看到第一次是集合视图调用它,第二次是一个BindingGroup
.
问题似乎是有两件事都认为他们负责IEditableObject
国家。当 WPF 提供默认的集合视图时,它会IEditableObject
在集合中的对象上查找,并调用BeginEdit
和响应对相应EndEdit
方法的调用。而且,将调用方法以响应对and or的调用。CancelEdit
IEditableCollectionView
BindingGroup
IEditableObject
BeginEdit
CommitEdit
CancelEdit
使用DataGrid
这两个功能:当您连续开始和完成编辑时,它会通知IEditableCollectionView
和并且BindingGroup
两者都认为依次继续并通知IEditableObject
底层源对象的实现是他们的责任。
所以它看起来很像一个错误DataGrid
- 它导致两个不同的对象调用BeginEdit
(和相关的方法)。这是因为它利用了可编辑的集合视图和绑定组——从外观上看,它们并不是为了在同一对象上同时使用而设计的,就像DataGrid
使用它们的方式一样。
您在 Toolkit 中没有看到网格存在此问题的原因是它似乎是一个稍旧的版本 - 将其中的代码与 Reflector 为 .NET 4.0 显示的代码进行比较,您会发现 .NET 4.0DataGrid
具有一些额外的代码(一个新的方法,EnsureItemBindingGroup
和一些相关的代码在MeasureOverride
and中OnRowValidationRulesChanged
)确保绑定组总是存在,不管你是否要求它。因此,如果 WPF 工具包被更新,它可能会增加一个类似的功能,除非这个问题得到修复。(我猜想,如果您使用 WPF Toolkit 的当前版本(我写这篇文章时是 2010 年 2 月),并且您使用该ItemBindingGroup
属性明确要求绑定组,您会看到完全相同的问题。)
BeginEdit
正如您所描述的,这并没有解释如何调用随机对象。我无法重现。但它确实解释了对所选对象的双重调用。最好的办法似乎是对源对象进行编码,以便它们能够容忍双重调用。