Inheritance with INotifyPropertyChanged

2.4k views Asked by At

I was wondering if anyone knows how to solve the following problem... I have a base class that needs to update it's modifiedDateTime property when a derived class property is changed.

BaseObject.cs

public class BaseObject
{
    private DateTime? _modifiedDateTime;

    public DateTime? modifiedDateTime 
    {
        get { return _modifiedDateTime ; }
        set { _modifiedDateTime  = value; }
    }

    public BaseObject
    {
        _modifiedDateTime = DateTime.Now.ToUniversalTime();
    }

    public void Update(object sender, PropertyChangedEventArgs e)
    {
        _modifiedDateTime = DateTime.Now.ToUniversalTime();
    }
}

ExampleClass1.cs

public class ExampleClass1: BaseObject, INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private int _data;

    public int data
    {
        get { return _data; }
        set 
        {
            _data = value;
            PropertyChanged?.Invoke(this,  new PropertyChangedEventArgs("data"));               
        }
    }

    public ExampleClass1()
    {
        PropertyChanged += base.Update;
    }
}

The previous example is working as expected.

However if the derived class contains an object of another class. For example:

ExampleClass2.cs

public class ExampleClass2: BaseObject, INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private int _data;

    private ExampleClass1 _objClass1;

    public int data
    {
        get { return _data; }
        set 
        {
            _data = value;
            PropertyChanged?.Invoke(this,  new PropertyChangedEventArgs("data"));               
        }
    }

    public ExampleClass1 objClass1
    {
        get { return _objClass1; }
        set 
        {
            _objClass1 = value;
            PropertyChanged?.Invoke(this,  new PropertyChangedEventArgs("objClass1"));               
        }
    }

    public ExampleClass2()
    {
        PropertyChanged += base.Update;
    }
}

When I change the data property of the objClass1, the modifiedDateTime property of the ExampleClass2 inherited by the base class BaseObject is not updated.

How can I solve this problem?

1

There are 1 answers

0
Nkosi On BEST ANSWER

When you set the value of objClass1 subscribe to its property changed event as well

public ExampleClass1 objClass1 {
    get { return _objClass1; }
    set {
        //in case one already existed. unsubscribe from event
        if(_objClass1 != null) _objClass1.PropertyChanged -= base.Update
        _objClass1 = value;
        //subscribe to event
        if(_objClass1 != null) _objClass1.PropertyChanged += base.Update
        PropertyChanged?.Invoke(this,  new PropertyChangedEventArgs("objClass1"));               
    }
}