[Windows 8] Colecciones que reportan cambios ObservableCollection

Posted on


Artículo escrito por: Néstor Fernández.

Twitter: @xamlparaadeptos

Los controles que presentan listas de datos se enlazan a colecciones de las que toman los elementos que deben presentar. Sin embargo, puede suceder que cuando a dicha colección se le agregan, eliminan o reorganizan sus elementos el control que presenta esta información no se actualiza para mostrar esos cambios. Esto se debe a que algunas colecciones no notifican cuando algo así sucede y por lo tanto el control enlazado no refleja dichos cambios.

Cuando necesitemos este tipo de notificaciones podemos utilizar la colección genérica ObservableCollection. Un control que presente una lista de datos (o ItemsControl) refleja en tiempo real sobre la interface los cambios en esta colección.

NO CONFUNDIR
ObservableCollection tiene la capacidad de notificar cuando se agregan, eliminan o reorganizan sus elementos, pero no notifica cuando cambia el valor de una cualquiera de las propiedades de los elementos de la colección. Ese trabajo le corresponde a cada elemento implementando la interfase INotifyPropertyChanged o utilizando Dependecy Properties.

Declaración de una ObservableCollection

Declarar una ObservableCollection es igual de sencillo que declarar cualquier otra colección genérica, como en este ejemplo:

   1:  var MiColeccion = new ObservableCollection<ClasePersona>();
   2:   
   3:  public ObservableCollection<ClasePersona>() PropiedadColeccion {
   4:     get { return MiColeccion; }
   5:  }

En este caso la colección genérica puede contener datos del tipo "ClasePersona".

Todos los controles que presentan listas de datos tienen en común la propiedad "ItemsSource", a la que debemos asignarle la respectiva colección de datos. Por supuesto, esto lo podemos hacer a través de un Binding:

   1:  <ListView x:Name="lvPersonas" ItemsSource="{Binding Path=PropiedadColeccion}" />

o por código:

   1:  lvPersonas.ItemsSource = MiColeccion;

Modificaciones a una ObservableCollection

Las operaciones sobre una ObservableCollection que tienen la capacidad de notificar cambios son:

Adicionar

Al igual que en muchas colecciones, se utiliza el método Add():

   1:  var NuevaPersona = new ClasePersonas();
   2:  MiColeccion.Add(NuevaPersona);

Eliminar

Aquí se utiliza el método Remove() en alguna de sus dos sobrecargas. Para eliminar de la colección un elemento cuya referencia ya tenemos:

   1:  MiColeccion.Remove(ObjetoPersona);

O para eliminar de la colección un elemento cuando conocemos su posición en la colección:

   1:  int PosicionElemento = 3;
   2:  MiColeccion.RemoveAt(PosicionElemento);

Para vaciar completamente la colección:

   1:  MiColeccion.Clear();

Mover

Al mover un elemento este pasa a ocupar otra posición dentro de la colección. Utilizando el método Move solo debemos indicar la posición actual del elemento y en cual queremos ubicarlo:

   1:  int PosicionInicial = 3;
   2:  int PosicionFinal = 1;
   3:  MiColeccion.Move(PosicionInicial, PosicionFinal);

¿Y por código?

ObservableCollection expone el evento CollectionChanged al que podemos suscribirnos para recibir en código notificaciones cuando se agreguen, eliminen o muevan elementos de una colección:

   1:  MiColeccion.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(MiColeccion_CollectionChanged);
   2:   
   3:   void MiColeccion_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
   4:  { ... }

Y eso no es todo, el argumento "e", del tipo NotifyCollectionChangedEventArgs, nos provee información sobre el tipo de operación que se realizó sobre la colección, además de referencias a el o los elementos involucrados en dicha operación.

PARA SABER MÁS… Binding a control to a collection of objects

Un comentario sobre “[Windows 8] Colecciones que reportan cambios ObservableCollection

    Resumen Post 2012 « Todo en ASP.NET escribió:
    12/19/2012 en 22:05

    […] [Windows 8] Colecciones que reportan cambios ObservableCollection […]

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s