Browse Source

Update ItemsControl PseudoClasses on ItemCount property changed

pull/5844/head
Murdo R Ergeaux 5 years ago
parent
commit
b1db4ce6d2
  1. 22
      src/Avalonia.Controls/ItemsControl.cs
  2. 61
      tests/Avalonia.Controls.UnitTests/ItemsControlTests.cs

22
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(

61
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()
{

Loading…
Cancel
Save