Windows Phone Tips & Tricks. Implementando INotifyPropertyChanged al estilo Windows 8

[Nota: Este artículo pertenece a la serie de Windows Phone Tips & Tricks de MSDN España]

Hola,

En nuestras apps de Windows Phone 7.5, cuando usamos data bindings en nuestros XAML y queremos notificar a la vista de nuestra app que ha habido un cambio en una propiedad de un objeto asociada a uno de sus controles y que muestre el nuevo valor en el control, hacemos que la clase del objeto implemente el interfaz INotifyPropertyChanged.

Una manera de hacerlo es implementando una clase base como la siguiente:

using System.ComponentModel;

// Notifica a la vista cuando cambia el valor de una propiedad
public abstract class BindableBase : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public void RaisePropertyChanged(string propertyName)
    {
        if (this.PropertyChanged != null)
        {
            this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

Después hacemos que la clase del objeto en cuestión herede de dicha clase base, y que cada vez que se cambie la propiedad se notifique a la vista de dicho cambio:

// Regalo
public class Present : BindableBase
{
    // Nombre
    private string _name = "";
    public string Name
    {
        get
        {
            return this._name;
        }
        set
        {
            this._name = value;
            RaisePropertyChanged("Name");
        }
    }
}

Esto sigue funcionando en Windows Phone 8 sin problema.

Ahora, cuando creamos un nuevo proyecto de app para la Tienda de Windows 8, vemos que las plantillas de Visual Studio crean una nueva clase base llamada BindableBase que implementa INotifyPropertyChanged de manera diferente, utilizando un nuevo atributo de .NET 4.5: [CallerMemberName]

Esta misma aproximación podemos usarla en Windows Phone 8, y la nueva clase base tendrá este aspecto:

using System;
using System.ComponentModel;
using System.Runtime.CompilerServices;

// Notifica a la vista cuando cambia el valor de una propiedad
public abstract class BindableBase : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected bool SetProperty(ref T storage, T value, [CallerMemberName] String propertyName = null)
    {
        if (object.Equals(storage, value)) return false;

        storage = value;
        this.OnPropertyChanged(propertyName);
        return true;
    }

    protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        var eventHandler = this.PropertyChanged;
        if (eventHandler != null)
        {
            eventHandler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

La clase de nuestro objeto heredará de ella y notificará los cambios en sus propiedades así:

    // Regalo
    public class Present : BindableBase
    {
        // Nombre
        private string _name = "";
        public string Name
        {
            get {
                return this._name;
            }
            set {
                this.SetProperty(ref this._name, value);
            }
        }
    }

Gracias a [CallerMemberName] nos ahorramos tener que poner la cadena de texto con el nombre de la propiedad como tenemos que hacer cuando usamos la primera implementación. Así nos evitamos potenciales errores por escribir mal dicha cadena, y podemos cambiar los nombres de las propiedades de nuestras clases despreocupándonos de tener que cambiar cadenas de texto aquí y allá.

¿Y qué pasa con las apps de Windows Phone 7.5 cuya versión de .NET no tiene el atributo  [CallerMemberName]? Por fortuna contamos con el BCL Portability Pack, que nos permitirá utilizar este atributo. Para ello podemos ir a nuestro proyecto e instalar el paquete NuGet del paquete de portabilidad en nuestro proyecto:

20130110-172339

Podemos encontrar el paquete buscando Online por Microsoft.Bcl. Como todavía está en versión Prerelease, no nos tenemos que olvidar de indicarlo a la hora de realizar la búsqueda:

20130110-173506

Tras instalar el paquete se nos añadirán las referencias necesarias para usar el atributo que necesitamos:

20130110-173643

Un saludo,

Alejandro Campos Magencio (@alejacma)

PD: Mantente informado de todas las novedades de Microsoft para los desarrolladores españoles a través del Twitter de MSDN, el Facebook de MSDN, el Blog de MSDN y la Newsletter MSDN Flash.

About these ads

5 pensamientos en “Windows Phone Tips & Tricks. Implementando INotifyPropertyChanged al estilo Windows 8

  1. Pingback: Windows 8, Windows Phone 8, y Windows Phone 7. ¿Son primos o hermanos? (Parte 2) | ¡Desarrolladores, desarrolladores, desarrolladores!

  2. Pingback: Tips & Tricks de desarrollo para Windows Phone - MSDN España - Site Home - MSDN Blogs

  3. Pingback: Windows Phone Tips & Tricks. Windows Phone Tips & Tricks. Cómo serializar un objeto a un fichero Json en SkyDrive y deserializarlo | ¡Desarrolladores, desarrolladores, desarrolladores!

  4. Pingback: Windows Phone Tips & Tricks. Cómo serializar un objeto a un fichero Json en SkyDrive y deserializarlo | ¡Desarrolladores, desarrolladores, desarrolladores!

  5. Pingback: Windows Phone Tips & Tricks. Ejemplo de implementación del patrón MVVM | ¡Desarrolladores, desarrolladores, desarrolladores!

Deja un comentario

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