Ver Fonte

fixing PR for data validation for Combobox control and all SelectingItemsControl

aljosas há 4 anos atrás
pai
commit
ede1e2db94

+ 4 - 2
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<IEnumerable>();
@@ -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)

+ 66 - 14
tests/Avalonia.Controls.UnitTests/CarouselTests.cs

@@ -20,7 +20,12 @@ namespace Avalonia.Controls.UnitTests
         {
             var target = new Carousel
             {
-                Template = new FuncControlTemplate<Carousel>(CreateTemplate), Items = new[] { "Foo", "Bar" }
+                Template = new FuncControlTemplate<Carousel>(CreateTemplate),
+                Items = new[]
+                {
+                    "Foo",
+                    "Bar"
+                }
             };
 
             target.ApplyTemplate();
@@ -34,7 +39,12 @@ namespace Avalonia.Controls.UnitTests
         {
             var target = new Carousel
             {
-                Template = new FuncControlTemplate<Carousel>(CreateTemplate), Items = new[] { "Foo", "Bar" }
+                Template = new FuncControlTemplate<Carousel>(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<string> { "Foo", "Bar", "FooBar" };
+            var items = new ObservableCollection<string>
+            {
+                "Foo",
+                "Bar",
+                "FooBar"
+            };
 
             var target = new Carousel
             {
-                Template = new FuncControlTemplate<Carousel>(CreateTemplate), Items = items, IsVirtualized = false
+                Template = new FuncControlTemplate<Carousel>(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<string> { "Foo", "Bar", "FooBar" };
+            var items = new ObservableCollection<string>
+            {
+                "Foo",
+                "Bar",
+                "FooBar"
+            };
 
             var target = new Carousel
             {
-                Template = new FuncControlTemplate<Carousel>(CreateTemplate), Items = items, IsVirtualized = true,
+                Template = new FuncControlTemplate<Carousel>(CreateTemplate),
+                Items = items,
+                IsVirtualized = true,
             };
 
             target.ApplyTemplate();
@@ -130,7 +154,9 @@ namespace Avalonia.Controls.UnitTests
             var items = new ObservableCollection<string>();
             var target = new Carousel
             {
-                Template = new FuncControlTemplate<Carousel>(CreateTemplate), Items = items, IsVirtualized = false
+                Template = new FuncControlTemplate<Carousel>(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<string> { "Foo", "Bar", "FooBar" };
+            var items = new ObservableCollection<string>
+            {
+                "Foo",
+                "Bar",
+                "FooBar"
+            };
 
             var target = new Carousel
             {
-                Template = new FuncControlTemplate<Carousel>(CreateTemplate), Items = items, IsVirtualized = false
+                Template = new FuncControlTemplate<Carousel>(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<string> { "Foo", "Bar", "FooBar" };
+            var items = new ObservableCollection<string>
+            {
+                "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<string> { "Foo", "Bar", "FooBar" };
+            var items = new ObservableCollection<string>
+            {
+                "Foo",
+                "Bar",
+                "FooBar"
+            };
 
             var target = new Carousel
             {
-                Template = new FuncControlTemplate<Carousel>(CreateTemplate), Items = items, IsVirtualized = false
+                Template = new FuncControlTemplate<Carousel>(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<string> { "Foo", "Bar", "FooBar" };
+            var items = new ObservableCollection<string>
+            {
+                "Foo",
+                "Bar",
+                "FooBar"
+            };
 
             var target = new Carousel
             {
-                Template = new FuncControlTemplate<Carousel>(CreateTemplate), Items = items, IsVirtualized = false
+                Template = new FuncControlTemplate<Carousel>(CreateTemplate),
+                Items = items,
+                IsVirtualized = false
             };
 
             target.ApplyTemplate();

+ 1 - 36
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<ButtonSpinner>()
-                // .Select(b => b.Content)
-                .OfType<TextBox>()
-                .First();
-        }
-        // private IControlTemplate CreateTemplate()
-        // {
-        //     return new FuncControlTemplate<ComboBox>((control, scope) =>
-        //     {
-        //         var textBox =
-        //             new TextBox
-        //             {
-        //                 Name = "PART_TextBox"
-        //             }.RegisterInNameScope(scope);
-        //         return new ButtonSpinner
-        //         {
-        //             Name = "PART_Spinner",
-        //             Content = textBox,
-        //         }.RegisterInNameScope(scope);
-        //     });
-        // }
+        } 
     }
 }

+ 19 - 0
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<string>((_, __) => new Canvas()),
+            };
+
+            Prepare(target);
             
+            var exception = new System.InvalidCastException("failed validation");
+            var textObservable = new BehaviorSubject<BindingNotification>(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 }));
         }
     }
 }