Browse Source

Update ItemsControl PseudoClasses on ItemCount property changed

Murdo R Ergeaux 4 years ago
parent
commit
b1db4ce6d2

+ 14 - 8
src/Avalonia.Controls/ItemsControl.cs

@@ -70,7 +70,7 @@ namespace Avalonia.Controls
         /// </summary>
         public ItemsControl()
         {
-            PseudoClasses.Add(":empty");
+            UpdatePseudoClasses(0);
             SubscribeToItems(_items);
         }
 
@@ -323,6 +323,16 @@ namespace Avalonia.Controls
             base.OnKeyDown(e);
         }
 
+        protected override void OnPropertyChanged<T>(AvaloniaPropertyChangedEventArgs<T> change)
+        {
+            base.OnPropertyChanged(change);
+
+            if (change.Property == ItemCountProperty)
+            {
+                UpdatePseudoClasses(change.NewValue.GetValueOrDefault<int>());
+            }
+        }
+
         /// <summary>
         /// Called when the <see cref="Items"/> property changes.
         /// </summary>
@@ -346,8 +356,6 @@ namespace Avalonia.Controls
                 Presenter.Items = newValue;
             }
 
-            UpdatePseudoClasses();
-
             SubscribeToItems(newValue);
         }
 
@@ -373,8 +381,6 @@ namespace Avalonia.Controls
             }
 
             Presenter?.ItemsChanged(e);
-
-            UpdatePseudoClasses();
         }
 
         /// <summary>
@@ -466,10 +472,10 @@ namespace Avalonia.Controls
             }
         }
 
-        private void UpdatePseudoClasses()
+        private void UpdatePseudoClasses(int itemCount)
         {
-            PseudoClasses.Set(":empty", ItemCount == 0);
-            PseudoClasses.Set(":singleitem", ItemCount == 1);
+            PseudoClasses.Set(":empty", itemCount == 0);
+            PseudoClasses.Set(":singleitem", itemCount == 1);
         }
 
         protected static IInputElement GetNextControl(

+ 60 - 1
tests/Avalonia.Controls.UnitTests/ItemsControlTests.cs

@@ -379,6 +379,17 @@ namespace Avalonia.Controls.UnitTests
             Assert.DoesNotContain(":empty", target.Classes);
         }
 
+        [Fact]
+        public void Empty_Class_Should_Be_Set_When_Items_Not_Set()
+        {
+            var target = new ItemsControl()
+            {
+                Template = GetTemplate(),
+            };
+
+            Assert.Contains(":empty", target.Classes);
+        }
+
         [Fact]
         public void Empty_Class_Should_Be_Set_When_Empty_Collection_Set()
         {
@@ -444,7 +455,7 @@ namespace Avalonia.Controls.UnitTests
         [Fact]
         public void Empty_Class_Should_Not_Be_Set_When_Items_Collection_Count_Increases()
         {
-            var items = new ObservableCollection<int>() {};
+            var items = new ObservableCollection<int>() { };
 
             var target = new ItemsControl()
             {
@@ -457,6 +468,54 @@ namespace Avalonia.Controls.UnitTests
             Assert.DoesNotContain(":empty", target.Classes);
         }
 
+        [Fact]
+        public void Single_Item_Class_Should_Be_Set_When_Items_Collection_Count_Increases_To_One()
+        {
+            var items = new ObservableCollection<int>() { };
+
+            var target = new ItemsControl()
+            {
+                Template = GetTemplate(),
+                Items = items,
+            };
+
+            items.Add(1);
+
+            Assert.Contains(":singleitem", target.Classes);
+        }
+
+        [Fact]
+        public void Empty_Class_Should_Not_Be_Set_When_Items_Collection_Cleared()
+        {
+            var items = new ObservableCollection<int>() { 1, 2, 3 };
+
+            var target = new ItemsControl()
+            {
+                Template = GetTemplate(),
+                Items = items,
+            };
+
+            items.Clear();
+
+            Assert.DoesNotContain(":singleitem", target.Classes);
+        }
+
+        [Fact]
+        public void Single_Item_Class_Should_Not_Be_Set_When_Items_Collection_Count_Increases_Beyond_One()
+        {
+            var items = new ObservableCollection<int>() { 1 };
+
+            var target = new ItemsControl()
+            {
+                Template = GetTemplate(),
+                Items = items,
+            };
+
+            items.Add(2);
+
+            Assert.DoesNotContain(":singleitem", target.Classes);
+        }
+
         [Fact]
         public void Setting_Presenter_Explicitly_Should_Set_Item_Parent()
         {