Browse Source

Make UpdateDataValidation non-generic.

Steven Kirk 3 years ago
parent
commit
f9dbbb3da1

+ 7 - 5
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);
             }
         }
 

+ 7 - 3
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);
             }
         }
 

+ 6 - 3
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)
                     {

+ 2 - 2
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);
             }
         }
 

+ 6 - 3
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;

+ 7 - 3
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);
             }
         }
 

+ 7 - 3
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);
             }
         }
         

+ 5 - 2
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);
             }
         }
 

+ 5 - 2
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);
             }
         }
 

+ 14 - 14
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)));
             }
         }