diff --git a/src/Avalonia.Controls/ComboBox.cs b/src/Avalonia.Controls/ComboBox.cs index dbf49f0db5..86b1214ee9 100644 --- a/src/Avalonia.Controls/ComboBox.cs +++ b/src/Avalonia.Controls/ComboBox.cs @@ -85,7 +85,8 @@ namespace Avalonia.Controls /// Defines the property /// public static readonly StyledProperty TextProperty = - TextBlock.TextProperty.AddOwner(new(string.Empty, BindingMode.TwoWay)); + TextBlock.TextProperty.AddOwner(new(string.Empty, BindingMode.TwoWay, + enableDataValidation: true)); /// /// Defines the property. @@ -236,6 +237,14 @@ namespace Avalonia.Controls UpdateFlowDirection(); } + protected override void UpdateDataValidation(AvaloniaProperty property, BindingValueType state, Exception? error) + { + base.UpdateDataValidation(property, state, error); + + if (property == TextProperty) + DataValidationErrors.SetError(this, error); + } + protected internal override Control CreateContainerForItemOverride(object? item, int index, object? recycleKey) { return new ComboBoxItem(); diff --git a/tests/Avalonia.Controls.UnitTests/ComboBoxTests.cs b/tests/Avalonia.Controls.UnitTests/ComboBoxTests.cs index a7a4cdef39..9967502b80 100644 --- a/tests/Avalonia.Controls.UnitTests/ComboBoxTests.cs +++ b/tests/Avalonia.Controls.UnitTests/ComboBoxTests.cs @@ -391,6 +391,28 @@ namespace Avalonia.Controls.UnitTests } + [Fact] + public void Text_Validation() + { + using (UnitTestApplication.Start(TestServices.MockThreadingInterface)) + { + var target = new ComboBox + { + Template = GetTemplate(), + }; + + target.ApplyTemplate(); + target.Presenter!.ApplyTemplate(); + + var exception = new System.InvalidCastException("failed validation"); + var textObservable = new BehaviorSubject(new BindingNotification(exception, BindingErrorType.DataValidationError)); + target.Bind(ComboBox.TextProperty, textObservable); + + Assert.True(DataValidationErrors.GetHasErrors(target)); + Assert.Equal([exception], DataValidationErrors.GetErrors(target)); + } + } + [Fact] public void Close_Window_On_Alt_F4_When_ComboBox_Is_Focus() {