Clase BaseViewModel

Para implementar el patron MVVM, debemos hacer que nuestras clases ( del ViewModel ) implementen de la la interface INotifyPropertyChanged, que sirve para notiticar a los clientes (bindings) que el valor de la propiedad ha cambiado, por lo cual para cada ViewModel que hagamos debemos cumplir la firma de la interface lo cual se vuelve una tarea repetitiva y para tal efecto lo mas conveniente es crear una clase base abstracta que realize la implementacion de la interface y de la cual nosotros heredemos cada vez que se desee crear un ViewModel. La clase es como sigue:

  
using System;
using System.ComponentModel;
using System.Linq.Expressions;
using System.Diagnostics;
using System.Reflection;

namespace RegistryViewer
{
    public abstract class BaseViewModel : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

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

        public virtual void NotifyPropertyChanged( Expression<Func<object>> property )
        {
            MemberExpression memberExpression;
            if ( property.Body is UnaryExpression )
                memberExpression = ( property.Body as UnaryExpression ).Operand as MemberExpression;
            else
                memberExpression = property.Body as MemberExpression;

            if ( memberExpression == null )
                Debug.Assert( false, "It must not happen" );

            var propertyInfo = memberExpression.Member as PropertyInfo;
            if ( propertyInfo == null )
                Debug.Assert( false, "It must not happen" );

            this.NotifyPropertyChanged( propertyInfo.Name );
        }
    }
}

Publicar un comentario