public class ViewModelBase : INotifyPropertyChanged
{
#region interface
public event PropertyChangedEventHandler PropertyChanged = delegate { };
#endregion
public void NotifyOfPropertyChange(string propertyName)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
public void NotifyOfPropertyChange<TProperty>(Expression<Func<TProperty>> property)
{
var lambda = (LambdaExpression)property;
MemberExpression memberExpression;
if (lambda.Body is UnaryExpression)
{
var unaryExpression = (UnaryExpression)lambda.Body;
memberExpression = (MemberExpression)unaryExpression.Operand;
}
else
memberExpression = (MemberExpression)lambda.Body;
NotifyOfPropertyChange(memberExpression.Member.Name);
}
protected bool SetProperty<T>(ref T backingField, T value, string propertyName)
{
var changed = !EqualityComparer<T>.Default.Equals(backingField, value);
if (changed)
{
backingField = value;
NotifyOfPropertyChange(propertyName);
}
return changed;
}
protected bool SetProperty<T, TProperty>(ref T backingField, T value, Expression<Func<TProperty>> property)
{
var changed = !EqualityComparer<T>.Default.Equals(backingField, value);
if (changed)
{
backingField = value;
NotifyOfPropertyChange(property);
}
return changed;
}
}