This construction should not work either in the clone or in the original object:
public A PropA { get; set; } public B() { PropA.PropertyChanged += a_PropertyChanged; }
At the time the constructor is PropA property PropA still null - therefore it is impossible to subscribe to the event.
In reality, you apparently use another constructor to create an object B - that's why everything works. But when cloning stops.
There are two ways to fix the situation.
Method one.
The property should be made immutable in order to exclude the random assignment of a value outside the constructor (this assignment will not work correctly anyway):
public A PropA { get; } public B (A argA) { PropA = argA; PropA.PropertyChanged += a_PropertyChanged; }
When cloning an object, you must use the same constructor as at creation.
The second way.
Subscribing to an event should be done in the mutator properties:
private A fieldA; public A PropA { get { return fieldA; } set { if (fieldA != null) fieldA.PropertyChanged -= a_PropertyChanged; fieldA = value; if (fieldA != null) fieldA.PropertyChanged += a_PropertyChanged; } }
In this case, the object B will listen to events from the "connected" object A, regardless of who and how many times he reinstalled PropA to it.