Browse Source

Don't clear ItemIsOwnContainer in PanelContainerGenerator.

One shouldn't call `ClearContainer` on a container that is an item. Adjusted `SelectingItemsControlTests` because selection is actually maintained on move with containers hold their own `IsSelected` state.

Fixes #11128
pull/11138/head
Steven Kirk 3 years ago
parent
commit
c77276d00a
  1. 5
      src/Avalonia.Controls/Presenters/PanelContainerGenerator.cs
  2. 49
      tests/Avalonia.Controls.UnitTests/Primitives/SelectingItemsControlTests.cs

5
src/Avalonia.Controls/Presenters/PanelContainerGenerator.cs

@ -67,9 +67,12 @@ namespace Avalonia.Controls.Presenters
for (var i = 0; i < count; ++i)
{
var c = children[index + i];
if (!c.IsSet(ItemIsOwnContainerProperty))
{
itemsControl.RemoveLogicalChild(children[i + index]);
generator.ClearItemContainer(c);
generator.ClearItemContainer(c);
}
}
children.RemoveRange(index, count);

49
tests/Avalonia.Controls.UnitTests/Primitives/SelectingItemsControlTests.cs

@ -676,12 +676,8 @@ namespace Avalonia.Controls.UnitTests.Primitives
[Fact]
public void Moving_Selected_Item_Should_Clear_Selection()
{
var items = new AvaloniaList<Item>
{
new Item(),
new Item(),
};
using var app = Start();
var items = new ObservableCollection<string> { "foo", "bar" };
var target = new SelectingItemsControl
{
ItemsSource = items,
@ -706,7 +702,46 @@ namespace Avalonia.Controls.UnitTests.Primitives
Assert.NotNull(receivedArgs);
Assert.Empty(receivedArgs.AddedItems);
Assert.Equal(new[] { removed }, receivedArgs.RemovedItems);
Assert.All(items, x => Assert.False(x.IsSelected));
}
[Fact]
public void Moving_Selected_Container_Should_Not_Clear_Selection()
{
var items = new AvaloniaList<Item>
{
new Item(),
new Item(),
};
var target = new SelectingItemsControl
{
ItemsSource = items,
Template = Template(),
};
Prepare(target);
target.SelectedIndex = 1;
Assert.Equal(items[1], target.SelectedItem);
Assert.Equal(1, target.SelectedIndex);
var receivedArgs = new List<SelectionChangedEventArgs>();
target.SelectionChanged += (_, args) => receivedArgs.Add(args);
var moved = items[1];
items.Move(1, 0);
// Because the moved container is still marked as selected on the insert part of the
// move, it will remain selected.
Assert.Same(moved, target.SelectedItem);
Assert.Equal(0, target.SelectedIndex);
Assert.NotNull(receivedArgs);
Assert.Equal(2, receivedArgs.Count);
Assert.Equal(new[] { moved }, receivedArgs[0].RemovedItems);
Assert.Equal(new[] { moved }, receivedArgs[1].AddedItems);
Assert.True(items[0].IsSelected);
Assert.False(items[1].IsSelected);
}
[Fact]

Loading…
Cancel
Save