Browse Source

Numeric UpDown editors: fixed issue with with Value being set before the newValue is coerced and then having the Value set again. Now the Value is coerced and set only once.

pull/1645/head
brianlagunas_cp 15 years ago
parent
commit
256bc70a27
  1. 22
      ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Core/Primitives/UpDownBase.cs
  2. 15
      ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/DateTimeUpDown/Implementation/DateTimeUpDown.cs
  3. 31
      ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/NumericUpDown/Implementation/DecimalUpDown.cs
  4. 31
      ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/NumericUpDown/Implementation/DoubleUpDown.cs
  5. 31
      ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/NumericUpDown/Implementation/IntegerUpDown.cs
  6. 24
      ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/NumericUpDown/Implementation/NumericUpDown.cs

22
ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Core/Primitives/UpDownBase.cs

@ -73,10 +73,12 @@ namespace Microsoft.Windows.Controls.Primitives
protected virtual void OnValueChanged(T oldValue, T newValue)
{
CoerceValue(newValue);
ValidateValue(newValue);
SyncTextAndValueProperties(ValueProperty, string.Empty);
SetValidSpinDirection();
RoutedPropertyChangedEventArgs<object> args = new RoutedPropertyChangedEventArgs<object>(oldValue, newValue);
args.RoutedEvent = ValueChangedEvent;
RaiseEvent(args);
@ -109,6 +111,8 @@ namespace Microsoft.Windows.Controls.Primitives
TextBox = GetTemplateChild(ElementTextName) as TextBox;
Spinner = GetTemplateChild(ElementSpinnerName) as Spinner;
Spinner.Spin += OnSpinnerSpin;
SetValidSpinDirection();
}
protected override void OnGotFocus(RoutedEventArgs e)
@ -256,12 +260,11 @@ namespace Microsoft.Windows.Controls.Primitives
}
#region Abstract
/// <summary>
/// Coerces the value.
/// </summary>
protected abstract void CoerceValue(T value);
protected abstract T CoerceValue(T value);
/// <summary>
/// Converts the formatted text to a value.
@ -284,6 +287,17 @@ namespace Microsoft.Windows.Controls.Primitives
/// </summary>
protected abstract void OnDecrement();
/// <summary>
/// Sets the valid spin directions.
/// </summary>
protected abstract void SetValidSpinDirection();
/// <summary>
/// Validates the value and keeps it between the Min and Max values.
/// </summary>
/// <param name="value">The value.</param>
protected abstract void ValidateValue(T value);
#endregion //Abstract
#endregion //Methods

15
ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/DateTimeUpDown/Implementation/DateTimeUpDown.cs

@ -128,9 +128,10 @@ namespace Microsoft.Windows.Controls
TextBox.SelectionChanged += TextBox_SelectionChanged;
}
protected override void CoerceValue(DateTime? value)
protected override DateTime? CoerceValue(DateTime? value)
{
//TODO: implement Min and Max values and keep the Value between those parameters
//TODO: implement Minimum and Maximum
return value;
}
protected override void OnIncrement()
@ -207,6 +208,11 @@ namespace Microsoft.Windows.Controls
return dt.ToString(GetFormatString(Format), CultureInfo);
}
protected override void SetValidSpinDirection()
{
//TODO: implement Minimum and Maximum
}
protected override void OnValueChanged(DateTime? oldValue, DateTime? newValue)
{
//whenever the value changes we need to parse out the value into out DateTimeInfo segments so we can keep track of the individual pieces
@ -217,6 +223,11 @@ namespace Microsoft.Windows.Controls
base.OnValueChanged(oldValue, newValue);
}
protected override void ValidateValue(DateTime? value)
{
//TODO: implement min/max
}
#endregion //Base Class Overrides
#region Event Hanlders

31
ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/NumericUpDown/Implementation/DecimalUpDown.cs

@ -20,12 +20,14 @@ namespace Microsoft.Windows.Controls
#region Base Class Overrides
protected override void CoerceValue(decimal? value)
protected override decimal? CoerceValue(decimal? value)
{
if (value < Minimum)
Value = Minimum;
return Minimum;
else if (value > Maximum)
Value = Maximum;
return Maximum;
else
return value;
}
protected override void OnIncrement()
@ -54,6 +56,7 @@ namespace Microsoft.Windows.Controls
try
{
result = FormatString.Contains("P") ? ParsePercent(text, CultureInfo) : ParseDecimal(text, CultureInfo);
result = CoerceValue(result);
}
catch
{
@ -72,6 +75,28 @@ namespace Microsoft.Windows.Controls
return Value.Value.ToString(FormatString, CultureInfo);
}
protected override void SetValidSpinDirection()
{
ValidSpinDirections validDirections = ValidSpinDirections.None;
if (Value < Maximum || !Value.HasValue)
validDirections = validDirections | ValidSpinDirections.Increase;
if (Value > Minimum || !Value.HasValue)
validDirections = validDirections | ValidSpinDirections.Decrease;
if (Spinner != null)
Spinner.ValidSpinDirection = validDirections;
}
protected override void ValidateValue(decimal? value)
{
if (value < Minimum)
Value = Minimum;
else if (value > Maximum)
Value = Maximum;
}
#endregion //Base Class Overrides
}
}

31
ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/NumericUpDown/Implementation/DoubleUpDown.cs

@ -20,12 +20,14 @@ namespace Microsoft.Windows.Controls
#region Base Class Overrides
protected override void CoerceValue(double? value)
protected override double? CoerceValue(double? value)
{
if (value < Minimum)
Value = Minimum;
return Minimum;
else if (value > Maximum)
Value = Maximum;
return Maximum;
else
return value;
}
protected override void OnIncrement()
@ -54,6 +56,7 @@ namespace Microsoft.Windows.Controls
try
{
result = FormatString.Contains("P") ? Decimal.ToDouble(ParsePercent(text, CultureInfo)) : ParseDouble(text, CultureInfo);
result = CoerceValue(result);
}
catch
{
@ -72,6 +75,28 @@ namespace Microsoft.Windows.Controls
return Value.Value.ToString(FormatString, CultureInfo);
}
protected override void SetValidSpinDirection()
{
ValidSpinDirections validDirections = ValidSpinDirections.None;
if (Value < Maximum || !Value.HasValue)
validDirections = validDirections | ValidSpinDirections.Increase;
if (Value > Minimum || !Value.HasValue)
validDirections = validDirections | ValidSpinDirections.Decrease;
if (Spinner != null)
Spinner.ValidSpinDirection = validDirections;
}
protected override void ValidateValue(double? value)
{
if (value < Minimum)
Value = Minimum;
else if (value > Maximum)
Value = Maximum;
}
#endregion //Base Class Overrides
}
}

31
ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/NumericUpDown/Implementation/IntegerUpDown.cs

@ -20,12 +20,14 @@ namespace Microsoft.Windows.Controls
#region Base Class Overrides
protected override void CoerceValue(int? value)
protected override int? CoerceValue(int? value)
{
if (value < Minimum)
Value = Minimum;
return Minimum;
else if (value > Maximum)
Value = Maximum;
return Maximum;
else
return value;
}
protected override void OnIncrement()
@ -55,6 +57,7 @@ namespace Microsoft.Windows.Controls
{
//don't know why someone would format an integer as %, but just in case they do.
result = FormatString.Contains("P") ? Decimal.ToInt32(ParsePercent(text, CultureInfo)) : ParseInt(text, CultureInfo);
result = CoerceValue(result);
}
catch
{
@ -73,6 +76,28 @@ namespace Microsoft.Windows.Controls
return Value.Value.ToString(FormatString, CultureInfo);
}
protected override void SetValidSpinDirection()
{
ValidSpinDirections validDirections = ValidSpinDirections.None;
if (Value < Maximum || !Value.HasValue)
validDirections = validDirections | ValidSpinDirections.Increase;
if (Value > Minimum || !Value.HasValue)
validDirections = validDirections | ValidSpinDirections.Decrease;
if (Spinner != null)
Spinner.ValidSpinDirection = validDirections;
}
protected override void ValidateValue(int? value)
{
if (value < Minimum)
Value = Minimum;
else if (value > Maximum)
Value = Maximum;
}
#endregion //Base Class Overrides
}
}

24
ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/NumericUpDown/Implementation/NumericUpDown.cs

@ -73,7 +73,7 @@ namespace Microsoft.Windows.Controls
protected virtual void OnMaximumChanged(T oldValue, T newValue)
{
//SetValidSpinDirection();
SetValidSpinDirection();
}
#endregion //Maximum
@ -96,7 +96,7 @@ namespace Microsoft.Windows.Controls
protected virtual void OnMinimumChanged(T oldValue, T newValue)
{
//SetValidSpinDirection();
SetValidSpinDirection();
}
#endregion //Minimum
@ -126,8 +126,6 @@ namespace Microsoft.Windows.Controls
TextBox.GotKeyboardFocus += OnTextBoxGotKeyBoardFocus;
TextBox.PreviewMouseLeftButtonDown += OnTextBoxPreviewMouseLeftButtonDown;
}
//SetValidSpinDirection();
}
#endregion //Base Class Overrides
@ -152,24 +150,6 @@ namespace Microsoft.Windows.Controls
#region Methods
/// <summary>
/// Sets the valid spin direction based on current value, minimum and maximum.
/// </summary>
//private void SetValidSpinDirection()
//{
// ValidSpinDirections validDirections = ValidSpinDirections.None;
// if (Value < Maximum)
// validDirections = validDirections | ValidSpinDirections.Increase;
// if (Value > Minimum)
// validDirections = validDirections | ValidSpinDirections.Decrease;
// if (Spinner != null)
// Spinner.ValidSpinDirection = validDirections;
//}
protected static decimal ParseDecimal(string text, IFormatProvider cultureInfo)
{
return Decimal.Parse(text, NumberStyles.Any, cultureInfo);

Loading…
Cancel
Save