Sam*_*Sam 17 wpf datagrid ieditableobject
我有一个DataGrid绑定到IEditableObject的集合.
现在当我在一个单元格中单击两次时,它将被打开以进行编辑.
有趣的是:BeginEdit将被调用两次.有时对于相同的EditableObject,但有时对于两个不同的对象(特别是当我使用PgDn直到我到达DataGrid的末尾)时,将首先调用正确的一个,然后从集合中调用其他一些项目,之前从未进行过聚焦.
EndEdit也被调用两次,但始终用于所选项,而不是错误的项.
这是一个已知的问题吗?任何解决方法只能获得(右侧)一个通知.
Ian*_*ths 21
如果在调用时BeginEdit
查看调试器中的堆栈跟踪,您将看到第一次,它是调用它的集合视图,第二次,它是a BindingGroup
.
问题似乎是有两件事都认为他们负责IEditableObject
国家.当WPF提供了默认的集合视图,它会寻找IEditableObject
在集合中的对象,并调用BeginEdit
,要么EndEdit
或CancelEdit
响应调用相应的IEditableCollectionView
方法.而且,在BindingGroup
将调用IEditableObject
响应于呼叫方法BeginEdit
和CommitEdit
或CancelEdit
.
在DataGrid
使用这两个功能:当你在一排开始和完成编辑时,通知IEditableCollectionView
和对BindingGroup
这些东西也都认为这是他们又将责任去并通知IEditableObject
底层源对象上执行.
所以它看起来很像一个错误DataGrid
- 它导致两个不同的对象调用BeginEdit
(和相关的方法).这是因为它利用了可编辑的集合视图和绑定组 - 从它的外观来看,它们并不是设计为在同一个对象上同时DataGrid
使用它们的方式.
您没有在Toolkit中看到网格问题的原因是它看起来是一个稍微旧的版本 - 将其中的代码与Reflector对.NET 4.0的显示进行比较,您将看到.NET 4.0 DataGrid
具有一些额外的代码(一种新的方法,EnsureItemBindingGroup
以及一些相关的代码MeasureOverride
和OnRowValidationRulesChanged
)这是一种确保绑定组始终存在,无论你问与否.因此,如果更新了WPF工具包,除非得到修复,否则它可能会增加类似的功能.(我想如果你使用当前版本 - 我写这篇文章的2010年2月 - 来自WPF工具包,你使用该ItemBindingGroup
属性明确询问绑定组,你会看到完全相同的问题.)
这并不能解释如何BeginEdit
按照您的描述调用随机对象.我无法重复这一点.但它确实解释了对所选对象的双重调用.最好的办法似乎是对源对象进行编码,以便它们能够容忍双重调用.