WPF ObservableCollection-Bearbeitungsmodus

8

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

    
OrPaz 25.10.2010, 12:05
quelle

4 Antworten

2

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.

    
Matthieu 25.10.2010, 12:15
quelle
5

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: Ссылка

    
Thomas Levesque 25.10.2010 12:16
quelle
3

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.

    
Aliostad 25.10.2010 12:14
quelle
0

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 ...

    
OrPaz 31.10.2010 09:20
quelle

Tags und Links