/// <summary>
 /// Receive its one sub node's one property has changed
 /// </summary>
 /// <param name="obj"> The sub node which property changed </param>
 /// <param name="propertyName"> The changed property name </param>
 protected void ReceiveSubPropertyChanged(TreeNodeNotifiableViewModel obj, string propertyName)
 {
     if (!OnSubPropertyChanged(propertyName))
     {
         return;
     }
     OnPropertyChanged(propertyName);
     NotifyParentPropertyChanged(obj, propertyName);
 }
 /// <summary>
 /// Report to its parent that its one property has changed.
 /// </summary>
 /// <param name="obj"> The object which property value changed </param>
 /// <param name="propertyName"> The changed property name </param>
 protected void NotifyParentPropertyChanged(TreeNodeNotifiableViewModel obj, string propertyName)
 {
     _propertyChangedNotification?.Invoke(obj, propertyName);
 }
 public void AddNode(TreeNodeNotifiableViewModel node)
 {
     node._propertyChangedNotification = ReceiveSubPropertyChanged;
     base.AddNode(node);
 }