ListView wurde nicht korrekt mit ObservableCollection aktualisiert

8

Ich verwende derzeit eine beobachtbare Sammlung, um meine Datenobjekte für eine ListView zu speichern. Das Hinzufügen neuer Objekte zur Sammlung funktioniert problemlos und das listView wird ordnungsgemäß aktualisiert. Wenn ich jedoch versuche, eine der Eigenschaften eines Objekts in der Sammlung zu ändern, wird das ListView nicht ordnungsgemäß aktualisiert. Zum Beispiel habe ich eine beobachtbare Sammlung DataCollection. Ich versuche

%Vor%

Ich führe diese Änderung vor einem langen Vorgang aufgrund eines Tastendrucks durch. Das listView wird die Änderung nicht wiedergeben. Also füge ich myListView.Items.Refresh() ; hinzu. Das funktioniert, aber die listView wird erst aktualisiert, wenn die button_click-Methode abgeschlossen ist, was bis dahin nicht gut ist. Zum Beispiel:

%Vor%

Der Status wird niemals "Aktiv", sondern wird direkt nach Abschluss der Methode auf "Beendet" gesetzt. Ich habe auch versucht, einen Dispatcher wie folgt zu verwenden:

%Vor%

Das scheint aber auch nicht zu funktionieren. Irgendwelche Tipps oder Ideen würden geschätzt werden.

    
user793491 30.06.2011, 23:02
quelle

3 Antworten

3

Um das zu lösen, habe ich eine Klasse namens VeryObservableCollection erstellt. Für jedes Objekt, das Sie hinzufügen, hakt es das NotifyPropertyChanged-Ereignis des Objekts an einen Handler, der ein CollectionChanged-Ereignis auslöst. Für jedes entfernte Objekt wird der Handler entfernt. Sehr einfach und wird Ihnen genau das geben, was Sie wollen. Teilcode:

%Vor%     
Ed Bayiates 30.06.2011, 23:08
quelle
3

Sie müssen geeignete Datenbindungstechniken verwenden, und dann wird dies automatisch funktionieren.

Erforderlich ...

  1. Implementieren Sie INotifyPropertyChanged für Ihre Klasse innerhalb der ObservableCollection (und stellen Sie sicher, dass Sie das Ereignis auslösen, wenn Sie Eigenschaften für diese Klasse festlegen)
  2. Achten Sie auf Ihrer ItemTemplate in der ListView darauf, dass Sie Binding mit den Eigenschaften
  3. verwenden

Wenn Sie diese beiden Dinge tun, brauchen Sie keinen "Refresh" -Anruf oder irgendetwas anderes. Durch das Festlegen einer Eigenschaft, die INotifyPropertyChanged auslöst, wird die Bindung des ItemTemplate aktualisiert.

Implementieren von INotifyPropertyChanged für Ihre Klasse innerhalb der ObservableCollection ... (Suchen Sie die BindableBase-Klasse, wenn Sie sie nicht bereits kennen)

%Vor%

Ihre ListView

%Vor%

Ihre ObservableCollection ...

%Vor%

Hinzufügen von Objekten zur Sammlung funktioniert ...

%Vor%

Und das Aktualisieren, wonach Sie gefragt haben, funktioniert ...

%Vor%

Keine Aufrufe von "Aktualisieren" oder irgendetwas anderes benötigt. Das Element selbst wird aktualisiert, ohne dass sich die Liste ändert.

Vor dem Aktualisieren von Punkt 4 ...

Nach der Aktualisierung von Punkt 4 ...

Das vollständige Codebeispiel ist hier verfügbar: CODE-BEISPIEL

    
Andrew Bares 26.10.2015 16:00
quelle
2

Sie sind auf das klassische Problem mit ObservableCollection gestoßen. Es wird nur benachrichtigt, wenn ein Element hinzugefügt oder entfernt wird. Es benachrichtigt nicht, wenn sich eine Eigenschaft eines Elements in der Auflistung ändert. Wenn Sie über solche Änderungen informiert werden möchten, müssen Sie Ihre eigene benutzerdefinierte Sammlung erstellen und die geänderten Eigenschaften der Eigenschaften für die einzelnen Objekte manuell hinzufügen / entfernen. Entschuldigung, Alter.

    
Muad'Dib 30.06.2011 23:04
quelle