using System.Collections.Generic;
using System.ComponentModel;
using System.Runtime.CompilerServices;
public static void Main()
using (var model = new CustomerModel()) {
model.PropertyChanged += (sender, e) => {
Console.WriteLine("{0}: {1}", e.PropertyName, sender.GetType().GetProperty(e.PropertyName).GetValue(sender));
model.CustomerName = "Efraín Reyes";
model.CustomerName = "Efraín Reyes";
model.CustomerName = null;
model.CustomerName = null;
model.CustomerName = null;
public abstract class ModelBase : INotifyPropertyChanged, IDisposable {
private event PropertyChangedEventHandler _propertyChanged;
private List<PropertyChangedEventHandler> _propertyChangedSubscribers =
new List<PropertyChangedEventHandler>();
public event PropertyChangedEventHandler PropertyChanged {
if (!_propertyChangedSubscribers.Contains(value)) {
_propertyChanged += value;
_propertyChangedSubscribers.Add(value);
_propertyChanged -= value;
_propertyChangedSubscribers.Remove(value);
private void NotifyPropertyChanged(string propertyName = "")
if (_propertyChanged != null)
_propertyChanged(this, new PropertyChangedEventArgs(propertyName));
protected void SetProperty<T>(ref T field, T value, [CallerMemberName]string property = "") {
if (!EqualityComparer<T>.Default.Equals(field, value)) {
NotifyPropertyChanged(property);
_propertyChangedSubscribers.Clear();
public class CustomerModel : ModelBase {
private string _customerName;
public string CustomerName {
get { return _customerName; }
set { SetProperty(ref _customerName, value); }
get { return _orderCount; }
set { SetProperty(ref _orderCount, value); }