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;