Browse Source

Make UpdateDataValidation non-generic.

pull/8021/head
Steven Kirk 5 years ago
parent
commit
f9dbbb3da1
  1. 12
      src/Avalonia.Base/AvaloniaObject.cs
  2. 10
      src/Avalonia.Controls/AutoCompleteBox.cs
  3. 9
      src/Avalonia.Controls/Button.cs
  4. 4
      src/Avalonia.Controls/Calendar/CalendarDatePicker.cs
  5. 9
      src/Avalonia.Controls/MenuItem.cs
  6. 10
      src/Avalonia.Controls/NumericUpDown/NumericUpDown.cs
  7. 10
      src/Avalonia.Controls/Primitives/SelectingItemsControl.cs
  8. 7
      src/Avalonia.Controls/Slider.cs
  9. 7
      src/Avalonia.Controls/TextBox.cs
  10. 28
      tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_DataValidation.cs

12
src/Avalonia.Base/AvaloniaObject.cs

@ -646,10 +646,12 @@ namespace Avalonia
/// enabled. /// enabled.
/// </summary> /// </summary>
/// <param name="property">The property.</param> /// <param name="property">The property.</param>
/// <param name="value">The new binding value for the property.</param> /// <param name="state">The current data binding state.</param>
protected virtual void UpdateDataValidation<T>( /// <param name="error">The current data binding error, if any.</param>
AvaloniaProperty<T> property, protected virtual void UpdateDataValidation(
BindingValue<T> value) AvaloniaProperty property,
BindingValueType state,
Exception? error)
{ {
} }
@ -860,7 +862,7 @@ namespace Avalonia
if (metadata.EnableDataValidation == true) if (metadata.EnableDataValidation == true)
{ {
UpdateDataValidation(property, value); UpdateDataValidation(property, value.Type, value.Error);
} }
} }

10
src/Avalonia.Controls/AutoCompleteBox.cs

@ -1346,12 +1346,16 @@ namespace Avalonia.Controls
/// enabled. /// enabled.
/// </summary> /// </summary>
/// <param name="property">The property.</param> /// <param name="property">The property.</param>
/// <param name="value">The new binding value for the property.</param> /// <param name="state">The current data binding state.</param>
protected override void UpdateDataValidation<T>(AvaloniaProperty<T> property, BindingValue<T> value) /// <param name="error">The current data binding error, if any.</param>
protected override void UpdateDataValidation(
AvaloniaProperty property,
BindingValueType state,
Exception? error)
{ {
if (property == TextProperty || property == SelectedItemProperty) if (property == TextProperty || property == SelectedItemProperty)
{ {
DataValidationErrors.SetError(this, value.Error); DataValidationErrors.SetError(this, error);
} }
} }

9
src/Avalonia.Controls/Button.cs

@ -498,12 +498,15 @@ namespace Avalonia.Controls
protected override AutomationPeer OnCreateAutomationPeer() => new ButtonAutomationPeer(this); protected override AutomationPeer OnCreateAutomationPeer() => new ButtonAutomationPeer(this);
/// <inheritdoc/> /// <inheritdoc/>
protected override void UpdateDataValidation<T>(AvaloniaProperty<T> property, BindingValue<T> value) protected override void UpdateDataValidation(
AvaloniaProperty property,
BindingValueType state,
Exception? error)
{ {
base.UpdateDataValidation(property, value); base.UpdateDataValidation(property, state, error);
if (property == CommandProperty) if (property == CommandProperty)
{ {
if (value.Type == BindingValueType.BindingError) if (state == BindingValueType.BindingError)
{ {
if (_commandCanExecute) if (_commandCanExecute)
{ {

4
src/Avalonia.Controls/Calendar/CalendarDatePicker.cs

@ -540,11 +540,11 @@ namespace Avalonia.Controls
} }
} }
protected override void UpdateDataValidation<T>(AvaloniaProperty<T> property, BindingValue<T> value) protected override void UpdateDataValidation(AvaloniaProperty property, BindingValueType state, Exception? error)
{ {
if (property == SelectedDateProperty) if (property == SelectedDateProperty)
{ {
DataValidationErrors.SetError(this, value.Error); DataValidationErrors.SetError(this, error);
} }
} }

9
src/Avalonia.Controls/MenuItem.cs

@ -501,12 +501,15 @@ namespace Avalonia.Controls
return new MenuItemAutomationPeer(this); return new MenuItemAutomationPeer(this);
} }
protected override void UpdateDataValidation<T>(AvaloniaProperty<T> property, BindingValue<T> value) protected override void UpdateDataValidation(
AvaloniaProperty property,
BindingValueType state,
Exception? error)
{ {
base.UpdateDataValidation(property, value); base.UpdateDataValidation(property, state, error);
if (property == CommandProperty) if (property == CommandProperty)
{ {
_commandBindingError = value.Type == BindingValueType.BindingError; _commandBindingError = state == BindingValueType.BindingError;
if (_commandBindingError && _commandCanExecute) if (_commandBindingError && _commandCanExecute)
{ {
_commandCanExecute = false; _commandCanExecute = false;

10
src/Avalonia.Controls/NumericUpDown/NumericUpDown.cs

@ -403,12 +403,16 @@ namespace Avalonia.Controls
/// enabled. /// enabled.
/// </summary> /// </summary>
/// <param name="property">The property.</param> /// <param name="property">The property.</param>
/// <param name="value">The new binding value for the property.</param> /// <param name="state">The current data binding state.</param>
protected override void UpdateDataValidation<T>(AvaloniaProperty<T> property, BindingValue<T> value) /// <param name="error">The current data binding error, if any.</param>
protected override void UpdateDataValidation(
AvaloniaProperty property,
BindingValueType state,
Exception? error)
{ {
if (property == TextProperty || property == ValueProperty) if (property == TextProperty || property == ValueProperty)
{ {
DataValidationErrors.SetError(this, value.Error); DataValidationErrors.SetError(this, error);
} }
} }

10
src/Avalonia.Controls/Primitives/SelectingItemsControl.cs

@ -501,12 +501,16 @@ namespace Avalonia.Controls.Primitives
/// enabled. /// enabled.
/// </summary> /// </summary>
/// <param name="property">The property.</param> /// <param name="property">The property.</param>
/// <param name="value">The new binding value for the property.</param> /// <param name="state">The current data binding state.</param>
protected override void UpdateDataValidation<T>(AvaloniaProperty<T> property, BindingValue<T> value) /// <param name="error">The current data binding error, if any.</param>
protected override void UpdateDataValidation(
AvaloniaProperty property,
BindingValueType state,
Exception? error)
{ {
if (property == SelectedItemProperty) if (property == SelectedItemProperty)
{ {
DataValidationErrors.SetError(this, value.Error); DataValidationErrors.SetError(this, error);
} }
} }

7
src/Avalonia.Controls/Slider.cs

@ -361,11 +361,14 @@ namespace Avalonia.Controls
Value = IsSnapToTickEnabled ? SnapToTick(finalValue) : finalValue; Value = IsSnapToTickEnabled ? SnapToTick(finalValue) : finalValue;
} }
protected override void UpdateDataValidation<T>(AvaloniaProperty<T> property, BindingValue<T> value) protected override void UpdateDataValidation(
AvaloniaProperty property,
BindingValueType state,
Exception? error)
{ {
if (property == ValueProperty) if (property == ValueProperty)
{ {
DataValidationErrors.SetError(this, value.Error); DataValidationErrors.SetError(this, error);
} }
} }

7
src/Avalonia.Controls/TextBox.cs

@ -1262,11 +1262,14 @@ namespace Avalonia.Controls
return new TextBoxAutomationPeer(this); return new TextBoxAutomationPeer(this);
} }
protected override void UpdateDataValidation<T>(AvaloniaProperty<T> property, BindingValue<T> value) protected override void UpdateDataValidation(
AvaloniaProperty property,
BindingValueType state,
Exception? error)
{ {
if (property == TextProperty) if (property == TextProperty)
{ {
DataValidationErrors.SetError(this, value.Error); DataValidationErrors.SetError(this, error);
} }
} }

28
tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_DataValidation.cs

@ -52,14 +52,14 @@ namespace Avalonia.Base.UnitTests
source.OnNext(BindingValue<int>.DataValidationError(new Exception())); source.OnNext(BindingValue<int>.DataValidationError(new Exception()));
source.OnNext(7); source.OnNext(7);
var result = target.Notifications.Cast<BindingValue<int>>().ToList(); var result = target.Notifications;
Assert.Equal(4, result.Count); Assert.Equal(4, result.Count);
Assert.Equal(BindingValueType.Value, result[0].Type); Assert.Equal(BindingValueType.Value, result[0].type);
Assert.Equal(6, result[0].Value); Assert.Equal(6, result[0].value);
Assert.Equal(BindingValueType.BindingError, result[1].Type); Assert.Equal(BindingValueType.BindingError, result[1].type);
Assert.Equal(BindingValueType.DataValidationError, result[2].Type); Assert.Equal(BindingValueType.DataValidationError, result[2].type);
Assert.Equal(BindingValueType.Value, result[3].Type); Assert.Equal(BindingValueType.Value, result[3].type);
Assert.Equal(7, result[3].Value); Assert.Equal(7, result[3].value);
} }
[Fact] [Fact]
@ -72,8 +72,7 @@ namespace Avalonia.Base.UnitTests
target.Bind(Class1.NonValidatedDirectProperty, source); target.Bind(Class1.NonValidatedDirectProperty, source);
source.OnNext(1); source.OnNext(1);
var result = target.Notifications.Cast<BindingValue<int>>().ToList(); Assert.Equal(1, target.Notifications.Count);
Assert.Equal(1, result.Count);
} }
[Fact] [Fact]
@ -154,13 +153,14 @@ namespace Avalonia.Base.UnitTests
set { SetAndRaise(ValidatedDirectStringProperty, ref _directString, value); } set { SetAndRaise(ValidatedDirectStringProperty, ref _directString, value); }
} }
public IList<object> Notifications { get; } = new List<object>(); public List<(BindingValueType type, object value)> Notifications { get; } = new();
protected override void UpdateDataValidation<T>( protected override void UpdateDataValidation(
AvaloniaProperty<T> property, AvaloniaProperty property,
BindingValue<T> value) BindingValueType state,
Exception error)
{ {
Notifications.Add(value); Notifications.Add((state, GetValue(property)));
} }
} }

Loading…
Cancel
Save