Visual Basic'de .NET platformunun gelişimiyle birlikte ObservableCollection(Of T) gibi genişletilmiş koleksiyonlar ortaya çıkmıştır. Bu koleksiyon, kullanıcı arayüzünü (UI) veri değişiklikleri hakkında bilgilendirmek için tasarlanmıştır, özellikle veri bağlama (data binding) ile çalışırken önemlidir — örneğin, WPF veya MVVM yaklaşımını destekleyen WinForms gibi. List(Of T) veya ArrayList gibi erken biçimler otomatik bildirim desteği sunmadığından, görüntüleme mantığının manuel olarak revize edilmesini gerektirir.
Normal koleksiyonlar, arayüzü veya abone olmuş nesneleri kendi değişikliklerinden — öğelerin eklenmesi, silinmesi, yer değiştirmesi gibi — haberdar etmez. Sonuç olarak, arayüz denetimleri (örneğin, listeler, tablolar) otomatik olarak güncellenmez ve yeniden çizim veya güncelleme metotlarına ek çağrılar gerektirir. Bu tür manuel senkronizasyon hatalara yol açar ve kodun mantığını karmaşık hale getirir.
ObservableCollection(Of T), UI'nın herhangi bir ekleme, silme veya öğelerin değiştirilmesi ile otomatik olarak haberdar olmasını sağlayan INotifyCollectionChanged arayüzünü uygular. Koleksiyondaki nesnelerin değişimi sırasında veri güncellemeleri için, saklanan unsurların ayrıca INotifyPropertyChanged arayüzünü uygulaması tavsiye edilir.
Kod örneği:
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($"Eylem: {e.Action}") End Sub items.Add(New Item() With {.Name = "Test 1"}) items(0).Name = "Güncellenmiş İsim"
Anahtar özellikler:
INotifyPropertyChanged desteği gerekirObservableCollection, öğeler değiştiğinde, fakat koleksiyonun kendisi (içerik, boyut) değişmediğinde özellik değişikliklerini bildirebilir mi?
Hayır, varsayılan olarak ObservableCollection, yalnızca koleksiyonun kendisindeki değişiklikleri izler; öğelerin bireysel özelliklerini değil. UI'deki özellik değişikliklerini yansıtmak için, nesnelerin INotifyPropertyChanged arayüzünü uygulaması gerekir ve UI'deki bağlama bunu desteklemelidir.
Koleksiyon, UI akışının dışında değiştirildiğinde bildirim gerçekleşir mi?
Hayır, ana (UI) akışının dışında koleksiyondaki değişiklikler, bazı çerçevelerde (örneğin, WPF) hata veya hatalı davranışa neden olur. Çoklu iş parçacığı değişiklikleri için, senkronizasyonun doğru akışta gerçekleşmesi için Dispatcher.Invoke veya benzerlerini kullanmak gerekir.
ObservableCollection, bağlama için WinForms'ta kullanılabilir mi yoksa yalnızca WPF'de mi çalışır?
ObservableCollection, WinForms'da da çalışır, ancak WinForms'ta manuel senkronizasyon ve veri güncellemesi gereklidir, çünkü bu platformun standart bağlaması koleksiyon olaylarını her zaman tanımaz. WPF'de uygulama en şeffaf şekilde gerçekleştirilir.
ObservableCollection kullanımı, ancak içindeki nesneler INotifyPropertyChanged uygulamadığı için UI, özellik değişiklikleri güncellenmezProgramcı, arayüz için bir ürün listesi oluşturur, sıradan bir List(Of T) kullanır ve herhangi bir ekleme veya silme işlemi sonrasında elle UI güncelleme metotlarını çağırır. Bazen listeyi güncellemeyi unutur veya öğeleri silerken indeksleri yanlış hesaplar.
Artıları:
Eksileri:
ObservableCollection(Of T) uygulandı ve nesneler INotifyPropertyChanged'i destekliyor. Tüm eylemler — ekleme, silme, değiştirme — bağlama sayesinde arayüzde otomatik olarak yansıtılır. UI mantığı, çok fazla manuel güncelleme olmadan basitleşmiş bir yanıt verme haline geçer.
Artıları:
Eksileri: