が呼び出されたときにデバッガーでスタック トレースをBeginEdit
見ると、1 回目はそれを呼び出すコレクション ビューであり、2 回目はBindingGroup
.
問題は、両者が国家を担当していると考えていることが 2 つあることですIEditableObject
。IEditableObject
WPF が既定のコレクション ビューを提供する場合、コレクション内のオブジェクトを検索し、対応するメソッドへの呼び出しに応答して、またはBeginEdit
いずれかを呼び出します。また、 はandまたはの呼び出しに応答してメソッドを呼び出します。EndEdit
CancelEdit
IEditableCollectionView
BindingGroup
IEditableObject
BeginEdit
CommitEdit
CancelEdit
はDataGrid
両方の機能を使用します。連続して編集を開始して完了するIEditableCollectionView
と、と に通知し、これらの両方が、基になるソース オブジェクトBindingGroup
の実装に順番に進み、通知する責任があると考えます。IEditableObject
DataGrid
したがって、これは 2 つの異なるオブジェクトBeginEdit
(および関連するメソッド)を呼び出すバグのように見えます。これは、編集可能なコレクション ビューとバインディング グループを使用するためです。一見すると、これらは が使用するように、同じオブジェクトで同時に使用するようには設計されていませんDataGrid
。
Toolkit のグリッドでこの問題が見られない理由は、それが少し古いバージョンであるように見えるためです。.NET 4.0 の Reflector が示すコードとそのコードを比較すると、.NET 4.0DataGrid
には要求するかどうかに関係なく、バインディング グループが常に存在することを保証する追加のコード (新しいメソッド、 、およびおよびEnsureItemBindingGroup
の関連コード)。したがって、WPF ツールキットが更新された場合、これが修正されない限り、おそらく同様の機能が拡張されるでしょう。(そして、これを書いている 2010 年 2 月現在の WPF ツールキットを使用し、プロパティを使用してバインディング グループを明示的に要求すると、まったく同じ問題が発生すると思います。)MeasureOverride
OnRowValidationRulesChanged
ItemBindingGroup
BeginEdit
これは、説明したように、ランダム オブジェクトの呼び出しを取得する方法を説明していません。私はそれを再現することはできません。ただし、選択したオブジェクトの二重呼び出しについては説明しています。最善の方法は、ソース オブジェクトが二重呼び出しを許容するようにコーディングすることです。