فهرست منبع

Fix validation error not being cleared on valid input (#19477)

* Add failing test for binding error not being cleared, when bound value does not change

* Fix clearing binding error
Ondřej Sušovský 2 ماه پیش
والد
کامیت
21a38e81c4

+ 3 - 2
src/Avalonia.Base/Data/Core/BindingExpression.cs

@@ -355,8 +355,9 @@ internal partial class BindingExpression : UntypedBindingExpressionBase, IDescri
             }
             }
         }
         }
 
 
-        // Don't set the value if it's unchanged.
-        if (TypeUtilities.IdentityEquals(LeafNode.Value, value, type))
+        // Don't set the value if it's unchanged. If there is a binding error, we still have to set the value
+        // in order to clear the error.
+        if (TypeUtilities.IdentityEquals(LeafNode.Value, value, type) && ErrorType == BindingErrorType.None)
             return true;
             return true;
 
 
         try
         try

+ 20 - 0
tests/Avalonia.Base.UnitTests/Data/Core/BindingExpressionTests.DataValidation.cs

@@ -305,6 +305,26 @@ public partial class BindingExpressionTests
             BindingErrorType.DataValidationError);
             BindingErrorType.DataValidationError);
     }
     }
 
 
+    [Fact]
+    public void Setting_Valid_Value_Should_Clear_Binding_Error()
+    {
+        var data = new ViewModel { DoubleValue = 5.6 };
+        var target = CreateTargetWithSource(
+            data,
+            o => o.DoubleValue,
+            enableDataValidation: true,
+            mode: BindingMode.TwoWay,
+            targetProperty: TargetClass.StringProperty);
+
+        target.String = "5.6";
+        target.String = "5.6a";
+        target.String = "5.6";
+
+        AssertNoError(target, TargetClass.StringProperty);
+
+        GC.KeepAlive(data);
+    }
+
     public class ExceptionViewModel : NotifyingBase
     public class ExceptionViewModel : NotifyingBase
     {
     {
         private int _mustBePositive;
         private int _mustBePositive;