Ich verwende beobachtbare Sammlungen rund um meine Anwendungen. Mein Problem ist, dass wenn ich ein Popup-Fenster zum Bearbeiten dieser Entitäten verwende, meine gebundenen Listen geändert werden, wenn der Benutzer die entsprechenden Felder im Fenster ändert.
Wie könnte ich einfach die beobachtbaren Änderungsverifikationen einfrieren und sie nur freigeben, wenn die Entität gespeichert wird?
Danke, Oran
Sie könnten eine tiefe Kopie des Objekts erstellen, das Sie bearbeiten möchten. Auf diese Weise können Sie während der Bearbeitung auf die Kopie zugreifen, ohne das Original zu beeinträchtigen, das in der Liste verbleibt. Sobald Sie mit der Bearbeitung fertig sind, können Sie das Original durch die bearbeitete Version oder das Rollback ersetzen.
Ich denke, das Problem ist nicht mit der Sammlung, sondern mit den Entitäten selbst. ObservableCollection
löst ein Ereignis aus, wenn ein Element hinzugefügt oder entfernt wird, nicht wenn eine Eigenschaft eines Elements geändert wird. Dieser Teil wird von der INotifyPropertyChanged
verarbeitet, die von dem Element implementiert wird. Daher müssen Sie diese Benachrichtigung deaktivieren.
Ich schlage vor, dass Sie sich die Benutzeroberfläche IEditableObject
ansehen. Das ist für diese Art von Szenario konzipiert. Sie können die Benachrichtigungen in der Methode BeginEdit
deaktivieren und sie in EndEdit
und CancelEdit
erneut aktivieren.
EDIT: Paul Stovell hat eine schöne Implementierung von IEditableObject
wrapper hier:
Ссылка
Sie können verwenden:
%Vor%und binden Sie an die Ansicht, anstatt direkt an die ObservableCollection zu binden. Dies ist das gleiche Objekt, mit dem Sie Ihre Ausgabe filtern und sortieren können, ohne die Sammlung zu berühren.
Wenn Sie Änderungen stoppen möchten, verwenden Sie DeferRefresh()
. Wenn Sie fertig sind, rufen Sie Refresh()
auf.
WARNUNG
Dies zeigt nicht, dass Änderungen an jedem Element selbst angezeigt werden, sondern nur an der Liste.
Alle oben genannten Antworten sind großartig. aber ich fand eine gute und convinent prodeure, um das gewünschte auf eine effiziente und saubere Weise durchzuführen. Es basiert auf der Durchführung einer tiefen Kopie auf einem losgelösten Objekt, mit Matthieu MEZIL Entity Cloner ( Ссылка ).
Ausführliche Informationen finden Sie in den folgenden Abschnitten: Entity Framework-Ausnahme nach Clone anhängen
Danke für all die großartige Unterstützung ...
Tags und Links wpf binding wpf-controls