public override void OnUserInput(object value)
        {
            if (NotificationGate.IsInbound)
            {
                var scheduler = UpdateScheduler.Begin();

                try
                {
                    if (_hasChildObject && value != null)
                    {
                        value = ((IObjectInstance)value).WrappedObject;
                    }
                    ClassProperty.SetObjectValue(ObjectInstance.WrappedObject, value);
                }
                finally
                {
                    if (scheduler != null)
                    {
                        using (NotificationGate.BeginOutbound())
                        {
                            foreach (IUpdatable updatable in scheduler.End())
                            {
                                updatable.UpdateNow();
                            }
                        }
                    }
                }
            }
        }
 public override void UpdateNodes()
 {
     using (NotificationGate.BeginOutbound())
     {
         _depProperty.OnGet();
     }
     if (_child != null)
     {
         _child.UpdateNodes();
     }
 }
 public override void Dispose()
 {
     if (_child != null)
     {
         ObjectInstance.Tree.RemoveKey(_child.WrappedObject);
         _child.Dispose();
     }
     using (NotificationGate.BeginOutbound())
     {
         ObjectInstance.ClearValue(ClassProperty.DependencyProperty);
     }
     _depProperty.Dispose();
 }