using System.ComponentModel;
using System.Linq.Expressions;
public class ViewModelBase : INotifyPropertyChanged
public event PropertyChangedEventHandler PropertyChanged = delegate {};
protected void OnPropertyChanged(Expression<Func<object>> expression)
var f = (Func<object>)Expression.Lambda(expression).Compile().DynamicInvoke();
if (expression == null || !(expression.Body is MemberExpression))
Console.WriteLine("Failed to notify something was set to \"" + f() + "\" :(");
PropertyChanged(this, new PropertyChangedEventArgs(((MemberExpression)expression.Body).Member.Name));
Console.WriteLine("Successfully notified change of " + ((MemberExpression)expression.Body).Member.Name + " to \"" + f() + "\"!");
public class TestViewModel : ViewModelBase
public int ValueTypedMember
get { return _ValueTypedMember; }
_ValueTypedMember = value;
OnPropertyChanged(() => ValueTypedMember);
public string RefTypedMember
get { return _RefTypedMember; }
OnPropertyChanged(() => 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;