using System.ComponentModel;
using System.Linq.Expressions;
public class PropertyChangedBase : INotifyPropertyChanged
public event PropertyChangedEventHandler PropertyChanged = delegate {};
protected void NotifyOfPropertyChange<T>(Expression<Func<T>> expr)
throw new ArgumentNullException("expr");
var member = expr.Body as MemberExpression;
var unary = expr.Body as UnaryExpression;
member = unary.Operand as MemberExpression;
throw new ArgumentException("The body must be a member or unary expression");
PropertyChanged(this, new PropertyChangedEventArgs(member.Member.Name));
var f = (Func<T>)Expression.Lambda(expr).Compile().DynamicInvoke();
Console.WriteLine("Successfully notified change of " + member.Member.Name + " to \"" + f() + "\"!");
public class TestViewModel : PropertyChangedBase
public int ValueTypedMember
get { return _ValueTypedMember; }
_ValueTypedMember = value;
NotifyOfPropertyChange(() => ValueTypedMember);
public string RefTypedMember
get { return _RefTypedMember; }
NotifyOfPropertyChange(() => RefTypedMember);
public static void Main()
var vm = new TestViewModel();
Console.WriteLine("Changing the reference typed member...");
vm.RefTypedMember = "Hello World";
Console.WriteLine("\nChanging the value typed member...");
vm.ValueTypedMember = 42;