diff --git a/src/Avalonia.Controls/Primitives/SelectingItemsControl.cs b/src/Avalonia.Controls/Primitives/SelectingItemsControl.cs index ccdff8c9b7..19824a71f0 100644 --- a/src/Avalonia.Controls/Primitives/SelectingItemsControl.cs +++ b/src/Avalonia.Controls/Primitives/SelectingItemsControl.cs @@ -517,7 +517,6 @@ namespace Avalonia.Controls.Primitives { AutoScrollToSelectedItemIfNecessary(); } - if (change.Property == ItemsProperty && _updateState is null && _selection is object) { var newValue = change.NewValue.GetValueOrDefault(); @@ -868,7 +867,10 @@ namespace Avalonia.Controls.Primitives private ISelectionModel CreateDefaultSelectionModel() { - return new InternalSelectionModel { SingleSelect = !SelectionMode.HasFlagCustom(SelectionMode.Multiple), }; + return new InternalSelectionModel + { + SingleSelect = !SelectionMode.HasFlagCustom(SelectionMode.Multiple), + }; } private void InitializeSelectionModel(ISelectionModel model) diff --git a/tests/Avalonia.Controls.UnitTests/CarouselTests.cs b/tests/Avalonia.Controls.UnitTests/CarouselTests.cs index 393fde0faf..ea39093602 100644 --- a/tests/Avalonia.Controls.UnitTests/CarouselTests.cs +++ b/tests/Avalonia.Controls.UnitTests/CarouselTests.cs @@ -20,7 +20,12 @@ namespace Avalonia.Controls.UnitTests { var target = new Carousel { - Template = new FuncControlTemplate(CreateTemplate), Items = new[] { "Foo", "Bar" } + Template = new FuncControlTemplate(CreateTemplate), + Items = new[] + { + "Foo", + "Bar" + } }; target.ApplyTemplate(); @@ -34,7 +39,12 @@ namespace Avalonia.Controls.UnitTests { var target = new Carousel { - Template = new FuncControlTemplate(CreateTemplate), Items = new[] { "Foo", "Bar" } + Template = new FuncControlTemplate(CreateTemplate), + Items = new[] + { + "Foo", + "Bar" + } }; target.ApplyTemplate(); @@ -69,11 +79,18 @@ namespace Avalonia.Controls.UnitTests [Fact] public void Selected_Item_Changes_To_First_Item_When_Items_Property_Changes() { - var items = new ObservableCollection { "Foo", "Bar", "FooBar" }; + var items = new ObservableCollection + { + "Foo", + "Bar", + "FooBar" + }; var target = new Carousel { - Template = new FuncControlTemplate(CreateTemplate), Items = items, IsVirtualized = false + Template = new FuncControlTemplate(CreateTemplate), + Items = items, + IsVirtualized = false }; target.ApplyTemplate(); @@ -98,11 +115,18 @@ namespace Avalonia.Controls.UnitTests [Fact] public void Selected_Item_Changes_To_First_Item_When_Items_Property_Changes_And_Virtualized() { - var items = new ObservableCollection { "Foo", "Bar", "FooBar" }; + var items = new ObservableCollection + { + "Foo", + "Bar", + "FooBar" + }; var target = new Carousel { - Template = new FuncControlTemplate(CreateTemplate), Items = items, IsVirtualized = true, + Template = new FuncControlTemplate(CreateTemplate), + Items = items, + IsVirtualized = true, }; target.ApplyTemplate(); @@ -130,7 +154,9 @@ namespace Avalonia.Controls.UnitTests var items = new ObservableCollection(); var target = new Carousel { - Template = new FuncControlTemplate(CreateTemplate), Items = items, IsVirtualized = false + Template = new FuncControlTemplate(CreateTemplate), + Items = items, + IsVirtualized = false }; target.ApplyTemplate(); @@ -148,11 +174,18 @@ namespace Avalonia.Controls.UnitTests [Fact] public void Selected_Index_Changes_To_None_When_Items_Assigned_Null() { - var items = new ObservableCollection { "Foo", "Bar", "FooBar" }; + var items = new ObservableCollection + { + "Foo", + "Bar", + "FooBar" + }; var target = new Carousel { - Template = new FuncControlTemplate(CreateTemplate), Items = items, IsVirtualized = false + Template = new FuncControlTemplate(CreateTemplate), + Items = items, + IsVirtualized = false }; target.ApplyTemplate(); @@ -175,7 +208,12 @@ namespace Avalonia.Controls.UnitTests [Fact] public void Selected_Index_Is_Maintained_Carousel_Created_With_Non_Zero_SelectedIndex() { - var items = new ObservableCollection { "Foo", "Bar", "FooBar" }; + var items = new ObservableCollection + { + "Foo", + "Bar", + "FooBar" + }; var target = new Carousel { @@ -199,11 +237,18 @@ namespace Avalonia.Controls.UnitTests [Fact] public void Selected_Item_Changes_To_Next_First_Item_When_Item_Removed_From_Beggining_Of_List() { - var items = new ObservableCollection { "Foo", "Bar", "FooBar" }; + var items = new ObservableCollection + { + "Foo", + "Bar", + "FooBar" + }; var target = new Carousel { - Template = new FuncControlTemplate(CreateTemplate), Items = items, IsVirtualized = false + Template = new FuncControlTemplate(CreateTemplate), + Items = items, + IsVirtualized = false }; target.ApplyTemplate(); @@ -226,11 +271,18 @@ namespace Avalonia.Controls.UnitTests [Fact] public void Selected_Item_Changes_To_First_Item_If_SelectedItem_Is_Removed_From_Middle() { - var items = new ObservableCollection { "Foo", "Bar", "FooBar" }; + var items = new ObservableCollection + { + "Foo", + "Bar", + "FooBar" + }; var target = new Carousel { - Template = new FuncControlTemplate(CreateTemplate), Items = items, IsVirtualized = false + Template = new FuncControlTemplate(CreateTemplate), + Items = items, + IsVirtualized = false }; target.ApplyTemplate(); diff --git a/tests/Avalonia.Controls.UnitTests/ComboBoxTests.cs b/tests/Avalonia.Controls.UnitTests/ComboBoxTests.cs index 9f90037032..a06211c040 100644 --- a/tests/Avalonia.Controls.UnitTests/ComboBoxTests.cs +++ b/tests/Avalonia.Controls.UnitTests/ComboBoxTests.cs @@ -202,41 +202,6 @@ namespace Avalonia.Controls.UnitTests } - } - private ComboBox CreateControl() - { - var control = new ComboBox() - { - Template = GetTemplate() - }; - - control.ApplyTemplate(); - return control; - } - - private TextBox GetTextBox(ComboBox control) - { - return control.GetTemplateChildren() - // .OfType() - // .Select(b => b.Content) - .OfType() - .First(); - } - // private IControlTemplate CreateTemplate() - // { - // return new FuncControlTemplate((control, scope) => - // { - // var textBox = - // new TextBox - // { - // Name = "PART_TextBox" - // }.RegisterInNameScope(scope); - // return new ButtonSpinner - // { - // Name = "PART_Spinner", - // Content = textBox, - // }.RegisterInNameScope(scope); - // }); - // } + } } } diff --git a/tests/Avalonia.Controls.UnitTests/ListBoxTests.cs b/tests/Avalonia.Controls.UnitTests/ListBoxTests.cs index d13f5b704d..94ada5520e 100644 --- a/tests/Avalonia.Controls.UnitTests/ListBoxTests.cs +++ b/tests/Avalonia.Controls.UnitTests/ListBoxTests.cs @@ -1,11 +1,14 @@ using System.Linq; +using System.Reactive.Subjects; using Avalonia.Collections; using Avalonia.Controls.Presenters; using Avalonia.Controls.Primitives; using Avalonia.Controls.Templates; +using Avalonia.Data; using Avalonia.Input; using Avalonia.LogicalTree; using Avalonia.Styling; +using Avalonia.Threading; using Avalonia.UnitTests; using Avalonia.VisualTree; using Xunit; @@ -564,7 +567,23 @@ namespace Avalonia.Controls.UnitTests [Fact] public void SelectedItem_Validation() { + var target = new ListBox + { + Template = ListBoxTemplate(), + Items = new[] { "Foo" }, + ItemTemplate = new FuncDataTemplate((_, __) => new Canvas()), + }; + + Prepare(target); + var exception = new System.InvalidCastException("failed validation"); + var textObservable = new BehaviorSubject(new BindingNotification(exception, BindingErrorType.DataValidationError)); + target.Bind(ComboBox.SelectedItemProperty, textObservable); + + Dispatcher.UIThread.RunJobs(); + + Assert.True(DataValidationErrors.GetHasErrors(target)); + Assert.True(DataValidationErrors.GetErrors(target).SequenceEqual(new[] { exception })); } } }