From 21a38e81c4e404a3694b139ff3888dcd01e3e1fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Su=C5=A1ovsk=C3=BD?= Date: Tue, 19 Aug 2025 12:08:25 +0200 Subject: [PATCH] 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 --- .../Data/Core/BindingExpression.cs | 5 +++-- .../BindingExpressionTests.DataValidation.cs | 20 +++++++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/Avalonia.Base/Data/Core/BindingExpression.cs b/src/Avalonia.Base/Data/Core/BindingExpression.cs index 46e4af7e3c..ca29dd6ffa 100644 --- a/src/Avalonia.Base/Data/Core/BindingExpression.cs +++ b/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; try diff --git a/tests/Avalonia.Base.UnitTests/Data/Core/BindingExpressionTests.DataValidation.cs b/tests/Avalonia.Base.UnitTests/Data/Core/BindingExpressionTests.DataValidation.cs index 8e1865f209..2a57026576 100644 --- a/tests/Avalonia.Base.UnitTests/Data/Core/BindingExpressionTests.DataValidation.cs +++ b/tests/Avalonia.Base.UnitTests/Data/Core/BindingExpressionTests.DataValidation.cs @@ -305,6 +305,26 @@ public partial class BindingExpressionTests 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 { private int _mustBePositive;