How to capture old value and new value in INotifyPropertyChanged implementation of PropertyChanged event in C#

后端 未结 4 788
[愿得一人]
[愿得一人] 2021-01-19 16:03

I need to capture old value, new value and property name in PropertyChanged event handler. The default implementation of INotifyPropertyChanged provides only name of the pro

4条回答
  •  庸人自扰
    2021-01-19 16:46

    Just Implement your own PropertyChangedEventArgs.

    Implemeting a new Interface not necessary.

    This solutions works. Here is one of the benefits of polymorphism

    public class PropertyChangedExtendedEventArgs : PropertyChangedEventArgs
    {
            public virtual object OldValue { get; private set; }
            public virtual object NewValue { get; private set; }
    
            public PropertyChangedExtendedEventArgs(string propertyName, object oldValue, 
                   object newValue)
                   : base(propertyName)
            {
                OldValue = oldValue;
                NewValue = newValue;
            }
        }
    
    public class NotifyObject : INotifyPropertyChanged
        {
            public event PropertyChangedEventHandler PropertyChanged;
            protected void NotifyPropertyChanged(string propertyName, object oldvalue, object newvalue)
            {
                if (PropertyChanged != null)
                    PropertyChanged(this, new PropertyChangedExtendedEventArgs(propertyName, oldvalue, newvalue));
            }
        }
    
    
    
    public class Person : NotifyObject
        {
            private int _name;
            public int Name
            {
                get { return _name; }
                set
                {
                    var oldValue = _name;
                    _name = value;
                    NotifyPropertyChanged("Name", oldValue, value);
    
                }
            }
        }
    

    And your view model

    Person person = new Person();
    person.PropertyChanged += person_PropertyChanged;
    
      void person_PropertyChanged(object sender, PropertyChangedEventArgs e)
            {
                var args = e as PropertyChangedExtendedEventArgs;
                //do whatever you want
            }
    

提交回复
热议问题