Bewährtes Verfahren zum Synchronisieren einer sich ändernden Liste des Modells mit einer ObservableList des ViewModels?

9

Ich habe ein (externes) Modell, das eine Liste ausstellt, die sich ständig ändert (sagen wir etwa alle zwei Sekunden). Ein ViewModel kennt diese Liste, die sich für PropertyChange-Ereignisse registriert. Dieses ViewModel stellt der UI auch eine ObservableCollection für die Datenbindung zur Verfügung.

%Vor%

Im Prinzip funktioniert das neben den ständig durchgeführten Updates gut. Mit jedem Update verliert der Benutzer seine Auswahl, d. H. Alle Elemente werden mit jedem Update abgewählt. Das ist kein Wunder, denn WPFs ListBox "sieht", dass eine neue Liste zugewiesen wurde.

Es muss also so sein, dass wir nicht eine neue ObservableCollection zuweisen, sondern den Inhalt der aktuellen ObservableCollection mit der aktualisierten Model.List

zusammenführen

Jetzt meine Fragen

  • Synchronisierungslisten - Gibt es Best Practices (oder Frameworks) für die Durchführung einer solchen Zusammenführung? (Kopiere neue Objekte in ObservableCollection, Lösche fehlende, aktualisiere geänderte Objekte)
  • Ausgewähltes Element - Wie kann ich sicherstellen, dass die ListBox das aktuell ausgewählte Element enthält (abgesehen von dem Fall, dass das Element entfernt wurde)
Seven 26.02.2013, 14:58
quelle

1 Antwort

2

Sie können entweder eine neue ObservableCollection aus der aktualisierten Modellliste generieren oder die aktuelle ObservableCollection mit der des Modells synchronisieren.

Wenn Sie sich für die zweite Variante entscheiden, sollten Sie möglicherweise die CollectionChanged-Ereignisse für jedes synchronisierte Element auslösen. Werfen Sie einen Blick auf diese ObservableCollection-Implementierung , die die Benachrichtigungen verzögern kann.

Wenn Sie das aktuelle SelectedItem beibehalten, wird die Instanz der ObservableCollection nicht geändert (was gilt, weil wir die Auflistungen synchronisieren) und die SelectedItem-Instanz wird nicht entfernt. Daher sollte das Listenfeld die Auswahl enthalten. Ich bin jedoch nicht sicher, ob das stimmt, wenn die NotifyCollectionChangedEventArgs.Action "Reset" ist. Wenn dies der Fall ist, können Sie den Ansatz verwenden, der sowohl eine Eigenschaft collection als auch eine Eigenschaft SelectedItem im ViewModel hat. Sie binden das SelectedItem des ViewModel an das ListBox.SelectedItem im TwoWay-Modus. Wenn Sie die Auflistungen synchronisieren, speichern Sie das SelectedItem in einer temporären Variablen und wenden es nach der Synchronisierung erneut an, falls es nicht entfernt wurde.

    
Arthur Nunes 26.02.2013, 15:55
quelle