gpt4 book ai didi

WPF DataGrid 在 IEditableObject 上调用 BeginEdit 两次?

转载 作者:行者123 更新时间:2023-12-03 13:52:09 24 4
gpt4 key购买 nike

我有一个绑定(bind)到 IEditableObject 集合的 DataGrid。

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

有趣的是:BeginEdit 会被调用两次。有时对于同一个 EditableObject,但有时对于两个不同的对象(特别是当我使用 PgDn 直到我到达 DataGrid 的末尾时)会首先调用正确的对象,然后是集合中的其他一些项目,这些项目以前从未成为焦点.

EndEdit 也被调用了两次,但总是针对选定的项目,而不是错误的项目。

这是一个已知问题吗?仅获得(正确的)一个通知的任何解决方法。

最佳答案

如果您在调用 BeginEdit 时查看调试器中的堆栈跟踪,您会看到第一次是 Collection View 调用它,第二次是 BindingGroup

问题似乎是有两件事都认为他们负责 IEditableObject 状态。当 WPF 提供默认 Collection View 时,它将在集合中的对象上查找 IEditableObject,并将调用 BeginEditEndEditCancelEdit 以响应对相应 IEditableCollectionView 方法的调用。而且, BindingGroup 将调用 IEditableObject 方法以响应对 BeginEditCommitEditCancelEdit 的调用。
DataGrid 使用这两个功能:当您连续开始和完成编辑时,它会通知 IEditableCollectionViewBindingGroup 并且这两件事都认为依次继续并通知底层源对象上的 IEditableObject 实现是它们的责任。

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

您在 Toolkit 中看不到网格存在此问题的原因是它似乎是一个稍旧的版本 - 将其中的代码与 Reflector 为 .NET 4.0 显示的代码进行比较,您会看到 .NET 4.0 DataGrid有一些额外的代码(一个新方法, EnsureItemBindingGroup 和一些相关的代码在 MeasureOverrideOnRowValidationRulesChanged 中)确保绑定(bind)组始终存在,无论您是否要求。因此,如果 WPF 工具包被更新,它可能会增加一个类似的功能,除非这个问题得到修复。 (而且我猜想,如果您使用 WPF 工具包的当前版本(我写这篇文章时是 2010 年 2 月),并且使用 ItemBindingGroup 属性显式询问绑定(bind)组,您会看到完全相同的问题。)

正如您所描述的,这并没有解释您如何在随机对象上调用 BeginEdit 。我无法重现。但它确实解释了对所选对象的双重调用。最好的办法似乎是对源对象进行编码,以便它们能够容忍双重调用。

关于WPF DataGrid 在 IEditableObject 上调用 BeginEdit 两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4450878/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com