WPF DataGrid在IEditableObject上调用BeginEdit两次?

Sam*_*Sam 17 wpf datagrid ieditableobject

我有一个DataGrid绑定到IEditableObject的集合.

现在当我在一个单元格中单击两次时,它将被打开以进行编辑.

有趣的是:BeginEdit将被调用两次.有时对于相同的EditableObject,但有时对于两个不同的对象(特别是当我使用PgDn直到我到达DataGrid的末尾)时,将首先调用正确的一个,然后从集合中调用其他一些项目,之前从未进行过聚焦.

EndEdit也被调用两次,但始终用于所选项,而不是错误的项.

这是一个已知的问题吗?任何解决方法只能获得(右侧)一个通知.

Ian*_*ths 21

如果在调用时BeginEdit查看调试器中的堆栈跟踪,您将看到第一次,它是调用它的集合视图,第二次,它是a BindingGroup.

问题似乎是有两件事都认为他们负责IEditableObject国家.当WPF提供了默认的集合视图,它会寻找IEditableObject在集合中的对象,并调用BeginEdit,要么EndEditCancelEdit响应调用相应的IEditableCollectionView方法.而且,在BindingGroup将调用IEditableObject响应于呼叫方法BeginEditCommitEditCancelEdit.

DataGrid使用这两个功能:当你在一排开始和完成编辑时,通知IEditableCollectionView BindingGroup这些东西也都认为这是他们又将责任去并通知IEditableObject底层源对象上执行.

所以它看起来很像一个错误DataGrid- 它导致两个不同的对象调用BeginEdit(和相关的方法).这是因为它利用了可编辑的集合视图和绑定组 - 从它的外观来看,它们并不是设计为在同一个对象上同时DataGrid使用它们的方式.

您没有在Toolkit中看到网格问题的原因是它看起来是一个稍微旧的版本 - 将其中的代码与Reflector对.NET 4.0的显示进行比较,您将看到.NET 4.0 DataGrid具有一些额外的代码(一种新的方法,EnsureItemBindingGroup以及一些相关的代码MeasureOverrideOnRowValidationRulesChanged)这是一种确保绑定组始终存在,无论你问与否.因此,如果更新了WPF工具包,除非得到修复,否则它可能会增加类似的功能.(我想如果你使用当前版本 - 我写这篇文章的2010年2月 - 来自WPF工具包,你使用该ItemBindingGroup属性明确询问绑定组,你会看到完全相同的问题.)

这并不能解释如何BeginEdit按照您的描述调用随机对象.我无法重复这一点.但它确实解释了对所选对象的双重调用.最好的办法似乎是对源对象进行编码,以便它们能够容忍双重调用.