Posts Tagged ‘ObservableCollection’

ObservableCollection y propiedades

26 marzo 2010

Problema: Tengo una ObservableCollection que contiene una coleccion de objetos que son de tipo de una clase creada por mi. Esta ObservableCollection esta bindeada a un elemento XAML. Cuando añado o quito elementos el elemento XAML se me actualiza, pero cuando modifico las propiedades de los elementos de la coleccion, el elemento XAML no se entera.

Solucion: Hacer que nuestra clase a la que pertenecen los objetos de la ObservableCollection implemente el interfaz INotifyPropertyChanged. Al implementar la interfaz necesitaremos añadir a nuestra clase un nuevo evento publico de tipo PropertyChangedEventHandler.

public event PropertyChangedEventHandler PropertyChanged;

Finalmente, para las propiedades que queramos que actualicen el elemento XAML tendremos que hacer que cuando cambien de valor (en el SET de la propiedad) lancen el evento antes comentado. Ejemplo con una propiedad llamada “miPropiedad”:

set
{
    _miPropiedad = value;
    if (PropertyChanged != null)
    {
        PropertyChanged(this, new PropertyChangedEventArgs("MiPropiedad"));
    }
}

Problemas con ObservableCollection y XAML

5 enero 2010

Problema: Cuando le hago un databinding declarativo (desde xaml)  de un control (p.ej. un gridview o un dropdownlist) a una propiedad  en código que contiene una ObservableCollection, no funciona o no funciona como me esperaba.

Solucion: Hay que revisar que la propiedad DataContext del control está correctamente asignada (o correctamente heredada) para que pueda encontrar la propiedad que contiene la ObservableCollection. Lo mismo para las propiedades path para que los valores que queremos se muestren correctamente.
Hay que tener en cuenta que el objeto ObservableCollection debe de estar disponible como una propiedad pública (get), y que las propiedades de los objetos que contiene la ObservableCollection y que queremos mostrar, también deben de estar disponibles a través de  una propiedad pública(get). 
Hay que tener en cuenta también que debemos haber asignado o creado el objecto ObservableCollection antes de que sea procesado el XAML (llamada a InitializeComponent()), de lo contrario el control que esté bindeado a la propiedad ObservableCollection no se enterará de los cambios en la colección hasta que no volvamos a asignarle en su propiedad correspondiente (p.ej. ItemsSource)  una nueva ObservableCollection sobre la que trabajar.
Por último, tener en cuenta que los cambios solo se verán reflejados automáticamente en WPF si trabajamos con la ObservableCollection original, si asignamos una nueva ObservableCollection a la propiedad que se referencia desde XAML, desde WPF no se apreciarán cambios (ya que en realidad estaríamos modificando otra ObservableCollection diferente, la lista referenciada desde el control no habría cambiado)