public static object MinValueCoerceValueCallback(DependencyObject d, object baseValue)
        {
            DragInput dragInput = d as DragInput;
            double    min       = (double)baseValue;

            return(min > dragInput.MaxValue ? dragInput.MaxValue : min);
        }
        //Not using this way because coerced value does not update the source of binding
        public static object ValueCoerceValueCallback(DependencyObject d, object baseValue)
        {
            DragInput dragInput = d as DragInput;
            double    val;

            if (double.TryParse(baseValue == null ? "0" : baseValue.ToString(), out val))
            {
                val = val > dragInput.MaxValue ? dragInput.MaxValue : (val < dragInput.MinValue ? dragInput.MinValue : val);
            }

            return(string.Format("{0:F" + dragInput.Precision + "}", val));
        }
        public static void ValuePropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            DragInput dragInput = d as DragInput;
            double    val;

            string strVal = e.NewValue == null ? "0" : e.NewValue.ToString();

            if (double.TryParse(strVal, out val))
            {
                val = val > dragInput.MaxValue ? dragInput.MaxValue : val < dragInput.MinValue ? dragInput.MinValue : val;
            }

            string formattedVal = string.Format("{0:F" + dragInput.Precision + "}", val);

            if (strVal != formattedVal)
            {
                dragInput.Value = formattedVal;
            }
        }