INotifyPropertyChanged With Generic Set Method
suggest changeThe NotifyPropertyChangedBaseclass below defines a generic Set method that can be called from any derived type.
public class NotifyPropertyChangedBase : INotifyPropertyChanged
{
    protected void RaisePropertyChanged([CallerMemberName] string propertyName = null) =>
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    
    public event PropertyChangedEventHandler PropertyChanged;
    public virtual bool Set<T>(ref T field, T value, [CallerMemberName] string propertyName = null)
    {
        if (Equals(field, value))
            return false;
        storage = value;
        RaisePropertyChanged(propertyName);
        return true;
    }
}
	To use this generic Set method, you simply need to create a class that derives from NotifyPropertyChangedBase.
public class SomeViewModel : NotifyPropertyChangedBase
{
    private string _foo;
    private int _bar;
    public string Foo
    {
        get { return _foo; }
        set { Set(ref _foo, value); }
    }
    public int Bar
    {
        get { return _bar; }
        set { Set(ref _bar, value); }
    }
}
	As shown above, you can call Set(ref _fieldName, value); in a property’s setter and it will automatically raise a PropertyChanged event if it is needed.
You can then register to the PropertyChanged event from another class that needs to handle property changes.
public class SomeListener
{
    public SomeListener()
    {
        _vm = new SomeViewModel();
        _vm.PropertyChanged += OnViewModelPropertyChanged;
    }
    private void OnViewModelPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        Console.WriteLine($"Property {e.PropertyName} was changed.");
    }
    private readonly SomeViewModel _vm;
}
	
  Found a mistake? Have a question or improvement idea?
  Let me know.
      
      Table Of Contents