In Visual Basic mit der Entwicklung der .NET-Plattform sind erweiterte Sammlungen wie ObservableCollection(Of T) entstanden. Diese Sammlung ist dafür gedacht, den Benutzeroberflächen (UI) über Datenänderungen zu informieren, was besonders wichtig ist, wenn man mit Datenbindungen (data binding) arbeitet – zum Beispiel in WPF oder WinForms mit Unterstützung des MVVM-Ansatzes. Frühere Konstrukte wie List(Of T) oder ArrayList unterstützten keine automatische Benachrichtigung über Änderungen und erforderten manuelle Überarbeitung der Anzeigelogik.
Gewöhnliche Sammlungen benachrichtigen die Benutzeroberfläche oder abonnierte Objekte nicht über eigene Änderungen – das Hinzufügen, Entfernen oder Umordnen von Elementen. Infolgedessen werden UI-Steuerelemente (zum Beispiel Listen, Tabellen) nicht automatisch aktualisiert und erfordern eine Neuzeichnung oder zusätzliche Aufrufe von Aktualisierungsmethoden. Eine solche manuelle Synchronisation führt zu Fehlern und verkompliziert die Logik des Codes.
ObservableCollection(Of T) implementiert das Interface INotifyCollectionChanged, was es der UI ermöglicht, automatisch über jede Hinzufügung, Löschung oder Änderung von Elementen informiert zu werden. Für eine umfassende Aktualisierung der Daten bei Änderungen der Objekte in der Sammlung wird empfohlen, dass die gespeicherten Elemente ebenfalls das Interface INotifyPropertyChanged implementieren.
Beispielcode:
Imports System.Collections.ObjectModel Imports System.ComponentModel Public Class Item Implements INotifyPropertyChanged Private _name As String Public Property Name As String Get Return _name End Get Set(value As String) If _name <> value Then _name = value RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("Name")) End If End Set End Property Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged End Class Dim items As New ObservableCollection(Of Item)() AddHandler items.CollectionChanged, Sub(s, e) Console.WriteLine($"Aktion: {e.Action}") End Sub items.Add(New Item() With {.Name = "Test 1"}) items(0).Name = "Aktualisierter Name"
Wesentliche Merkmale:
INotifyPropertyChanged erforderlich, um eine automatische Synchronisation mit der UI sicherzustellen.Kann ObservableCollection über Änderungen an den Eigenschaften von Elementen informieren, wenn das Element geändert wird, die Sammlung (Zusammensetzung, Größe) jedoch nicht?
Nein, standardmäßig verfolgt ObservableCollection nur Änderungen an der Sammlung selbst, nicht an den Eigenschaften einzelner Elemente. Um Änderungen der Eigenschaften in der UI widerzuspiegeln, müssen die Objekte das Interface INotifyPropertyChanged implementieren, und das Binding in der UI muss dies unterstützen.
Werden Änderungen gemeldet, wenn die Sammlung außerhalb des UI-Threads modifiziert wird?
Nein, Änderungen an der Sammlung außerhalb des Haupt- (UI-)Threads führen zu Fehlern oder unerwartetem Verhalten in bestimmten Frameworks (zum Beispiel WPF). Für mehrfädige Änderungen müssen Dispatcher.Invoke oder ähnliche Mechanismen verwendet werden, um die Synchronisation im richtigen Thread durchzuführen.
Kann ObservableCollection für das Binden in WinForms verwendet werden, oder funktioniert sie nur in WPF?
ObservableCollection funktioniert auch in WinForms, erfordert jedoch manuelle Synchronisation und Datenaktualisierung, da das Standardeinbindungsverfahren dieser Plattform nicht immer Ereignisse der Sammlung erkennt. In WPF ist die Implementierung maximal transparent.
ObservableCollection, aber die Elemente darin implementieren nicht INotifyPropertyChanged, sodass die UI bei Änderungen der Eigenschaften nicht aktualisiert wird.Ein Programmierer erstellt eine Liste von Waren für die Benutzeroberfläche, verwendet eine gewöhnliche List(Of T) und führt nach jeder Hinzufügung oder Löschung von Elementen manuell Aufrufe zur Aktualisierung der UI durch. Manchmal vergisst er, die Liste zu aktualisieren, oder berechnet die Indizes bei der Löschung von Elementen falsch.
Vorteile:
Nachteile:
ObservableCollection(Of T) wurde implementiert und die Objekte unterstützen INotifyPropertyChanged. Alle Aktionen – Hinzufügen, Löschen, Ändern – spiegeln sich automatisch in der Benutzeroberfläche durch Binding wider. Die Logik der UI wechselt zu einer vereinfachten Reaktion, ohne eine große Anzahl manueller Aktualisierungen.
Vorteile:
Nachteile: