Browse Source

Make UpdateDataValidation non-generic.

pull/8021/head
Steven Kirk 4 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.
/// </summary>
/// <param name="property">The property.</param>
/// <param name="value">The new binding value for the property.</param>
protected virtual void UpdateDataValidation<T>(
AvaloniaProperty<T> property,
BindingValue<T> value)
/// <param name="state">The current data binding state.</param>
/// <param name="error">The current data binding error, if any.</param>
protected virtual void UpdateDataValidation(
AvaloniaProperty property,
BindingValueType state,
Exception? error)
{
}
@ -860,7 +862,7 @@ namespace Avalonia
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.
/// </summary>
/// <param name="property">The property.</param>
/// <param name="value">The new binding value for the property.</param>
protected override void UpdateDataValidation<T>(AvaloniaProperty<T> property, BindingValue<T> value)
/// <param name="state">The current data binding state.</param>
/// <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)
{
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);
/// <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 (value.Type == BindingValueType.BindingError)
if (state == BindingValueType.BindingError)
{
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)
{
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);
}
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)
{
_commandBindingError = value.Type == BindingValueType.BindingError;
_commandBindingError = state == BindingValueType.BindingError;
if (_commandBindingError && _commandCanExecute)
{
_commandCanExecute = false;

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

@ -403,12 +403,16 @@ namespace Avalonia.Controls
/// enabled.
/// </summary>
/// <param name="property">The property.</param>
/// <param name="value">The new binding value for the property.</param>
protected override void UpdateDataValidation<T>(AvaloniaProperty<T> property, BindingValue<T> value)
/// <param name="state">The current data binding state.</param>
/// <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)
{
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.
/// </summary>
/// <param name="property">The property.</param>
/// <param name="value">The new binding value for the property.</param>
protected override void UpdateDataValidation<T>(AvaloniaProperty<T> property, BindingValue<T> value)
/// <param name="state">The current data binding state.</param>
/// <param name="error">The current data binding error, if any.</param>
protected override void UpdateDataValidation(
AvaloniaProperty property,
BindingValueType state,
Exception? error)
{
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;
}
protected override void UpdateDataValidation<T>(AvaloniaProperty<T> property, BindingValue<T> value)
protected override void UpdateDataValidation(
AvaloniaProperty property,
BindingValueType state,
Exception? error)
{
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);
}
protected override void UpdateDataValidation<T>(AvaloniaProperty<T> property, BindingValue<T> value)
protected override void UpdateDataValidation(
AvaloniaProperty property,
BindingValueType state,
Exception? error)
{
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(7);
var result = target.Notifications.Cast<BindingValue<int>>().ToList();
var result = target.Notifications;
Assert.Equal(4, result.Count);
Assert.Equal(BindingValueType.Value, result[0].Type);
Assert.Equal(6, result[0].Value);
Assert.Equal(BindingValueType.BindingError, result[1].Type);
Assert.Equal(BindingValueType.DataValidationError, result[2].Type);
Assert.Equal(BindingValueType.Value, result[3].Type);
Assert.Equal(7, result[3].Value);
Assert.Equal(BindingValueType.Value, result[0].type);
Assert.Equal(6, result[0].value);
Assert.Equal(BindingValueType.BindingError, result[1].type);
Assert.Equal(BindingValueType.DataValidationError, result[2].type);
Assert.Equal(BindingValueType.Value, result[3].type);
Assert.Equal(7, result[3].value);
}
[Fact]
@ -72,8 +72,7 @@ namespace Avalonia.Base.UnitTests
target.Bind(Class1.NonValidatedDirectProperty, source);
source.OnNext(1);
var result = target.Notifications.Cast<BindingValue<int>>().ToList();
Assert.Equal(1, result.Count);
Assert.Equal(1, target.Notifications.Count);
}
[Fact]
@ -154,13 +153,14 @@ namespace Avalonia.Base.UnitTests
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>(
AvaloniaProperty<T> property,
BindingValue<T> value)
protected override void UpdateDataValidation(
AvaloniaProperty property,
BindingValueType state,
Exception error)
{
Notifications.Add(value);
Notifications.Add((state, GetValue(property)));
}
}

Loading…
Cancel
Save