/// <summary>
        /// Remove an existing observer for this dependency property. <b>This call is needed to avoid memory leaks!</b>
        /// </summary>
        /// <param name="dp"></param>
        /// <param name="depObj">Dependency Object that observe this property</param>
        /// <param name="callback">Callback method is called in case of property value change</param>
        /// <returns>TRUE if success</returns>
        public static bool RemoveValueChanged(this DependencyProperty dp, DependencyObject depObj, EventHandler callback)
        {
            var dependencyPropertyDescriptor = DependencyPropertyDescriptor.FromProperty(dp, depObj.GetType());

            dependencyPropertyDescriptor.RemoveValueChanged(depObj, callback);
            DependencyPropertyUtils.RaiseRemovePropertyObserver(dp, depObj);

            return(true);
        }
        /// <summary>
        /// Add an observer for this dependency property. <b>Please remove callback with <see cref="RemoveValueChanged"/> to avoid memory leaks!</b>
        /// </summary>
        /// <param name="dp"></param>
        /// <param name="depObj">Dependency Object that observe this property</param>
        /// <param name="callback">Callback method is called in case of property value change</param>
        /// <param name="runImmediately">TRUE to run immediately (with this method call), otherwise FALSE. Default is TRUE</param>
        /// <returns>TRUE if success</returns>
        public static void AddValueChanged(this DependencyProperty dp, DependencyObject depObj, EventHandler callback, bool runImmediately = true)
        {
            var dependencyPropertyDescriptor = DependencyPropertyDescriptor.FromProperty(dp, depObj.GetType());

            dependencyPropertyDescriptor.AddValueChanged(depObj, callback);
            DependencyPropertyUtils.RaiseAddPropertyObserver(dp, depObj);

            if (runImmediately)
            {
                callback(dp, new EventArgs());
            }
        }