Browse Source

Merge pull request #11138 from AvaloniaUI/fixes/11128-container-clear

Don't clear ItemIsOwnContainer containers in PanelContainerGenerator.
gh-readonly-queue/master/pr-11141-95256f92b8a5823ccdcfba3f218ea5c2732eb79c
Max Katz 3 years ago
committed by GitHub
parent
commit
28a1bd7bed
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 5
      src/Avalonia.Controls/Presenters/PanelContainerGenerator.cs
  2. 13
      tests/Avalonia.Controls.UnitTests/ItemsControlTests.cs
  3. 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);

13
tests/Avalonia.Controls.UnitTests/ItemsControlTests.cs

@ -828,6 +828,19 @@ namespace Avalonia.Controls.UnitTests
Layout(target);
}
[Fact]
public void ItemIsOwnContainer_Content_Should_Not_Be_Cleared_When_Removed()
{
// Issue #11128.
using var app = Start();
var item = new ContentPresenter { Content = "foo" };
var target = CreateTarget(items: new[] { item });
target.Items.RemoveAt(0);
Assert.Equal("foo", item.Content);
}
private static ItemsControl CreateTarget(
object? dataContext = null,
IBinding? displayMemberBinding = null,

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