using System; using System.ComponentModel; using System.Linq.Expressions; using System.Runtime.CompilerServices; namespace TranslateTool.ViewModel { /// /// Implementation of INotifyPropertyChanged /// public abstract class NotificationObject : INotifyPropertyChanged { /// /// Property change handler /// public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged([CallerMemberName]string propertyName = null) { PropertyChangedEventHandler handler = PropertyChanged; if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); } protected void OnPropertyChanged(Expression> propertyExpression) { var propertyName = GetPropertyName(propertyExpression); OnPropertyChanged(propertyName); } protected void OnPropertyChanged(params Expression>[] propertyExpressions) { foreach (var expression in propertyExpressions) { OnPropertyChanged(expression); } } private static string GetPropertyName(Expression> propertyExpression) { if (propertyExpression == null) { throw new ArgumentNullException("propertyExpression"); } var memberExpression = propertyExpression.Body as MemberExpression; if (memberExpression != null) { return memberExpression.Member.Name; } var unaryExpression = propertyExpression.Body as UnaryExpression; if (unaryExpression != null) { var memberInfo = (MemberExpression)unaryExpression.Operand; return memberInfo.Member.Name; } return string.Empty; } } }