private static object NullValueCoerceValueCallback(DependencyObject sender, object value)
        {
            ValueRangeTextBox valueRangeTextBox = sender as ValueRangeTextBox;

            if (!valueRangeTextBox.IsInitialized)
            {
                return(DependencyProperty.UnsetValue);
            }
            if (value == null || value == DBNull.Value)
            {
                return(value);
            }
            Type valueDataType = valueRangeTextBox.ValueDataType;

            if (valueDataType == null)
            {
                throw new InvalidOperationException("An attempt was made to set a null value when the ValueDataType property is null.");
            }
            if (valueRangeTextBox.IsFinalizingInitialization)
            {
                value = ConvertValueToDataType(value, valueRangeTextBox.ValueDataType);
            }
            if (value.GetType() != valueDataType)
            {
                throw new ArgumentException("The value is not of type " + valueDataType.Name + ".", "NullValue");
            }
            return(value);
        }
        private static void ValueDataTypePropertyChangedCallback(DependencyObject sender, DependencyPropertyChangedEventArgs e)
        {
            ValueRangeTextBox valueRangeTextBox = sender as ValueRangeTextBox;
            Type type = e.NewValue as Type;

            valueRangeTextBox.IsNumericValueDataType = IsNumericType(type);
            valueRangeTextBox.RefreshConversionHelpers();
            valueRangeTextBox.ConvertValuesToDataType(type);
        }
        private static void FormatProviderPropertyChangedCallback(DependencyObject sender, DependencyPropertyChangedEventArgs e)
        {
            ValueRangeTextBox valueRangeTextBox = (ValueRangeTextBox)sender;

            if (valueRangeTextBox.IsInitialized)
            {
                valueRangeTextBox.OnFormatProviderChanged();
            }
        }
        private static object TextCoerceValueCallback(object sender, object value)
        {
            ValueRangeTextBox valueRangeTextBox = sender as ValueRangeTextBox;

            if (!valueRangeTextBox.IsInitialized)
            {
                return(DependencyProperty.UnsetValue);
            }
            if (value == null)
            {
                return(string.Empty);
            }
            return(value);
        }
        private static void NullValuePropertyChangedCallback(DependencyObject sender, DependencyPropertyChangedEventArgs e)
        {
            ValueRangeTextBox valueRangeTextBox = sender as ValueRangeTextBox;

            if (e.OldValue == null)
            {
                if (valueRangeTextBox.Value == null)
                {
                    valueRangeTextBox.RefreshValue();
                }
            }
            else if (e.OldValue.Equals(valueRangeTextBox.Value))
            {
                valueRangeTextBox.RefreshValue();
            }
        }
        private static void ValuePropertyChangedCallback(object sender, DependencyPropertyChangedEventArgs e)
        {
            ValueRangeTextBox valueRangeTextBox = sender as ValueRangeTextBox;

            if (!valueRangeTextBox.IsForcingValue && !object.Equals(e.NewValue, e.OldValue))
            {
                valueRangeTextBox.IsInValueChanged = true;
                try
                {
                    valueRangeTextBox.Text = valueRangeTextBox.GetTextFromValue(e.NewValue);
                }
                finally
                {
                    valueRangeTextBox.IsInValueChanged = false;
                }
            }
        }
        private static object ValueCoerceValueCallback(object sender, object value)
        {
            ValueRangeTextBox valueRangeTextBox = sender as ValueRangeTextBox;

            if (!valueRangeTextBox.IsInitialized)
            {
                return(DependencyProperty.UnsetValue);
            }
            if (valueRangeTextBox.IsFinalizingInitialization)
            {
                value = ConvertValueToDataType(value, valueRangeTextBox.ValueDataType);
            }
            if (!valueRangeTextBox.IsForcingValue)
            {
                valueRangeTextBox.ValidateValue(value);
            }
            return(value);
        }
        private static object ValueDataTypeCoerceValueCallback(DependencyObject sender, object value)
        {
            ValueRangeTextBox valueRangeTextBox = sender as ValueRangeTextBox;

            if (valueRangeTextBox.IsInitialized)
            {
                Type type = value as Type;
                try
                {
                    valueRangeTextBox.ValidateDataType(type);
                    return(value);
                }
                catch (Exception innerException)
                {
                    throw new ArgumentException("An error occured while trying to change the ValueDataType.", innerException);
                }
            }
            return(DependencyProperty.UnsetValue);
        }
        private static object MaxValueCoerceValueCallback(DependencyObject sender, object value)
        {
            ValueRangeTextBox valueRangeTextBox = sender as ValueRangeTextBox;

            if (!valueRangeTextBox.IsInitialized)
            {
                return(DependencyProperty.UnsetValue);
            }
            if (value == null)
            {
                return(value);
            }
            Type valueDataType = valueRangeTextBox.ValueDataType;

            if (valueDataType == null)
            {
                throw new InvalidOperationException("An attempt was made to set a maximum value when the ValueDataType property is null.");
            }
            if (valueRangeTextBox.IsFinalizingInitialization)
            {
                value = ConvertValueToDataType(value, valueRangeTextBox.ValueDataType);
            }
            if (value.GetType() != valueDataType)
            {
                throw new ArgumentException("The value is not of type " + valueDataType.Name + ".", "MinValue");
            }
            IComparable comparable = value as IComparable;

            if (comparable == null)
            {
                throw new InvalidOperationException("MaxValue does not implement the IComparable interface.");
            }
            object minValue = valueRangeTextBox.MinValue;

            valueRangeTextBox.ValidateValueInRange(minValue, value, valueRangeTextBox.Value);
            return(value);
        }