From b1db4ce6d23edb0ffc5ed340332518bce6d39850 Mon Sep 17 00:00:00 2001 From: Murdo R Ergeaux Date: Thu, 29 Apr 2021 08:39:02 +0100 Subject: [PATCH] Update ItemsControl PseudoClasses on ItemCount property changed --- src/Avalonia.Controls/ItemsControl.cs | 22 ++++--- .../ItemsControlTests.cs | 61 ++++++++++++++++++- 2 files changed, 74 insertions(+), 9 deletions(-) diff --git a/src/Avalonia.Controls/ItemsControl.cs b/src/Avalonia.Controls/ItemsControl.cs index 051e1fb0ed..20d032f597 100644 --- a/src/Avalonia.Controls/ItemsControl.cs +++ b/src/Avalonia.Controls/ItemsControl.cs @@ -70,7 +70,7 @@ namespace Avalonia.Controls /// public ItemsControl() { - PseudoClasses.Add(":empty"); + UpdatePseudoClasses(0); SubscribeToItems(_items); } @@ -323,6 +323,16 @@ namespace Avalonia.Controls base.OnKeyDown(e); } + protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change) + { + base.OnPropertyChanged(change); + + if (change.Property == ItemCountProperty) + { + UpdatePseudoClasses(change.NewValue.GetValueOrDefault()); + } + } + /// /// Called when the property changes. /// @@ -346,8 +356,6 @@ namespace Avalonia.Controls Presenter.Items = newValue; } - UpdatePseudoClasses(); - SubscribeToItems(newValue); } @@ -373,8 +381,6 @@ namespace Avalonia.Controls } Presenter?.ItemsChanged(e); - - UpdatePseudoClasses(); } /// @@ -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( diff --git a/tests/Avalonia.Controls.UnitTests/ItemsControlTests.cs b/tests/Avalonia.Controls.UnitTests/ItemsControlTests.cs index 5413d6d823..bfece7871c 100644 --- a/tests/Avalonia.Controls.UnitTests/ItemsControlTests.cs +++ b/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() {}; + var items = new ObservableCollection() { }; 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() { }; + + 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() { 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() { 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() {