En Visual Basic, con el desarrollo de la plataforma .NET, aparecieron colecciones avanzadas como ObservableCollection(Of T). Esta colección está diseñada para notificar a la interfaz de usuario (UI) sobre cambios en los datos, lo que es especialmente importante al trabajar con enlace de datos (data binding) —por ejemplo, en WPF o WinForms con soporte para el enfoque MVVM. Las construcciones anteriores como List(Of T) o ArrayList no soportaban notificación automática sobre cambios y requerían una reimplementación manual de la lógica de visualización.
Las colecciones normales no notifican a la interfaz o a los objetos suscritos sobre sus propios cambios —adiciones, eliminaciones, reordenamientos de elementos. Como resultado, los controles de UI (por ejemplo, listas, tablas) no se actualizan automáticamente y requieren redibujado o llamadas adicionales a métodos de actualización. Esta sincronización manual conduce a errores y complica la lógica del código.
ObservableCollection(Of T) implementa la interfaz INotifyCollectionChanged, lo que permite que la UI se entere automáticamente de cualquier adición, eliminación o modificación de elementos. Para una actualización completa de los datos al modificar los propios objetos en la colección, se recomienda que los elementos almacenados también implementen la interfaz INotifyPropertyChanged.
Ejemplo de código:
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($"Acción: {e.Action}") End Sub items.Add(New Item() With {.Name = "Test 1"}) items(0).Name = "Nombre Actualizado"
Características clave:
INotifyPropertyChanged para la sincronización automática con la UI¿Puede ObservableCollection notificar sobre cambios en las propiedades de los elementos, si el elemento cambia, pero la colección misma (composición, tamaño) no cambia?
No, por defecto ObservableCollection solo rastrea los cambios en la propia colección, no en las propiedades de elementos individuales. Para reflejar cambios en las propiedades en la UI, los objetos deben implementar la interfaz INotifyPropertyChanged, y el enlace en la UI debe soportar esto.
¿Se notificará sobre cambios si la colección se modifica fuera del hilo de la UI?
No, los cambios en la colección fuera del hilo principal (UI) generarán errores o comportamientos incorrectos en algunos frameworks (por ejemplo, WPF). Para cambios multihilo es necesario usar Dispatcher.Invoke o similares, para que la sincronización ocurra en el hilo correcto.
¿Se puede usar ObservableCollection para enlazar en WinForms o solo funciona en WPF?
ObservableCollection funciona también en WinForms, sin embargo, en WinForms se requiere una sincronización manual y actualización de datos, ya que el enlace estándar de esta plataforma no siempre reconoce los eventos de la colección. En WPF la implementación es lo más transparente posible.
ObservableCollection, pero los elementos dentro no implementan INotifyPropertyChanged, por lo que la UI no se actualiza al cambiar propiedadesUn programador crea una lista de productos para la interfaz, utiliza un List(Of T) normal, y después de cada adición o eliminación de elementos realiza manualmente llamadas a los métodos de actualización de la UI. A veces olvida actualizar la lista o calcula incorrectamente los índices al eliminar elementos.
Pros:
Contras:
Se ha implementado ObservableCollection(Of T) y los objetos soportan INotifyPropertyChanged. Todas las acciones —adiciones, eliminaciones, modificaciones— se reflejan automáticamente en la interfaz gracias al enlace. La lógica de la UI pasa a una respuesta simplificada, sin muchas actualizaciones manuales.
Pros:
Contras: