ändern Wenn Sie in dem Debugger an dem Stack-Trace aussehen, wenn BeginEdit
genannt wird, werden Sie Das ist das erste Mal, dass es die Sammelansicht ist, die es aufruft, und das zweite Mal ist es ein BindingGroup
.
Das Problem scheint zu sein, dass es zwei Dinge gibt, von denen beide denken, dass sie für den IEditableObject
-Zustand verantwortlich sind. Wenn WPF eine standardmäßige Auflistungsansicht bereitstellt, sucht es nach IEditableObject
für die Objekte in der Auflistung und ruft BeginEdit
und entweder EndEdit
oder CancelEdit
als Reaktion auf Aufrufe der entsprechenden IEditableCollectionView
-Methoden auf. Aber auch die BindingGroup
ruft die IEditableObject
Methoden in Reaktion auf Anrufe an BeginEdit
und CommitEdit
oder CancelEdit
.
Die DataGrid
verwendet beide Funktionen: Wenn Sie und vollständige Bearbeitungen in einer Reihe zu starten, benachrichtigt er den IEditableCollectionView
und die BindingGroup
und diese beiden Dinge denken, dass es ihre Verantwortung in der Reihe zu gehen und benachrichtigen die IEditableObject
Umsetzung auf das zugrunde liegende Quellobjekt.
So sieht es eher wie ein Fehler in den DataGrid
- es verursacht zwei verschiedene Objekte BeginEdit
(und verwandte Verfahren) zu nennen. Und das liegt daran, dass es editierbare Sammlungsansichten und Bindungsgruppen verwendet - von der Optik her waren diese nicht dafür vorgesehen, gleichzeitig auf den gleichen Objekten verwendet zu werden, so wie es die DataGrid
verwendet.
Der Grund, warum Sie dieses Problem mit dem Raster im Toolkit nicht sehen, ist, dass es eine etwas ältere Version zu sein scheint - Vergleichen des Codes darin mit dem, was Reflector für .NET 4.0 zeigt, werden Sie sehen .NET 4.0 DataGrid
hat zusätzlichen Code (eine neue Methode, , und einige verwandte Code in MeasureOverride
und OnRowValidationRulesChanged
), die sicherstellt, dass eine Bindungsgruppe immer vorhanden ist, ob Sie danach fragen oder nicht. Wenn das WPF-Toolkit aktualisiert wird, wird wahrscheinlich ein ähnliches Feature erstellt, sofern dies nicht behoben wird.(Und wenn Sie die aktuelle Ausgabe - Februar 2010, während ich dies schreibe - des WPF-Toolkits verwenden und die Eigenschaft ItemBindingGroup
verwenden, um explizit nach einer verbindlichen Gruppe zu fragen, würden Sie genau das gleiche Problem sehen.)
Dies erklärt nicht, wie Sie Anrufe auf BeginEdit
auf zufällige Objekte erhalten, wie Sie beschrieben haben. Das kann ich nicht wiederholen. Aber es erklärt doppelte Aufrufe für das ausgewählte Objekt. Am besten sollten Sie Ihre Quellobjekte so codieren, dass sie doppelte Aufrufe tolerieren.
Hörte interessant, so überprüfte ich mein Datagrid, die sich auch auf eine ObservableCollection gebunden ist und habe das nicht erleben ...? Meine Darstellung ist ein Objekt pro Zeile, verschmelzen Sie zufällig Objekte, die IEditableObject oder ähnliches implementieren? –
Interessant. Mein Objekt implementiert nur IEditableObject und INotifyPropertyChanged, daher gibt es keine Zusammenführung. Meine ObservableCollection wird jedoch in eine benutzerdefinierte ListCollectionView eingeschlossen. Und ich habe die Spalte an eine Eigenschaft in einer Klasse in meinem IEditableObject gebunden, nicht direkt an eine Eigenschaft des IEditableObject. Zumindest habe ich jetzt einen Grund, meine Quelle zu überprüfen, danke! – Sam
Die MSDN-Beispiele enthalten immer ein Flag, das BeginEdit daran hindert, seine Daten zu verarbeiten, wenn es zu einem anderen Zeitpunkt als dem ersten aufgerufen wird. Und nach meiner Erfahrung heißt es ja mehrmals. – peterG