diff --git a/src/Avalonia.Controls/Primitives/SelectingItemsControl.cs b/src/Avalonia.Controls/Primitives/SelectingItemsControl.cs
index 6f7bf4eb3f..4f01f5467b 100644
--- a/src/Avalonia.Controls/Primitives/SelectingItemsControl.cs
+++ b/src/Avalonia.Controls/Primitives/SelectingItemsControl.cs
@@ -342,24 +342,36 @@ namespace Avalonia.Controls.Primitives
{
base.OnContainersMaterialized(e);
- var selectedIndex = SelectedIndex;
- var selectedContainer = e.Containers
- .FirstOrDefault(x => (x.ContainerControl as ISelectable)?.IsSelected == true);
+ var resetSelectedItems = false;
- if (selectedContainer != null)
+ foreach (var container in e.Containers)
{
- SelectedIndex = selectedContainer.Index;
- }
- else if (selectedIndex >= e.StartingIndex &&
- selectedIndex < e.StartingIndex + e.Containers.Count)
- {
- var container = e.Containers[selectedIndex - e.StartingIndex];
+ if ((container.ContainerControl as ISelectable)?.IsSelected == true)
+ {
+ if (SelectedIndex == -1)
+ {
+ SelectedIndex = container.Index;
+ }
+ else
+ {
+ if (_selection.Add(container.Index))
+ {
+ resetSelectedItems = true;
+ }
+ }
- if (container.ContainerControl != null)
+ MarkContainerSelected(container.ContainerControl, true);
+ }
+ else if (_selection.Contains(container.Index))
{
MarkContainerSelected(container.ContainerControl, true);
}
}
+
+ if (resetSelectedItems)
+ {
+ ResetSelectedItems();
+ }
}
///
diff --git a/tests/Avalonia.Controls.UnitTests/Primitives/SelectingItemsControlTests_Multiple.cs b/tests/Avalonia.Controls.UnitTests/Primitives/SelectingItemsControlTests_Multiple.cs
index a44e23096f..2faced358b 100644
--- a/tests/Avalonia.Controls.UnitTests/Primitives/SelectingItemsControlTests_Multiple.cs
+++ b/tests/Avalonia.Controls.UnitTests/Primitives/SelectingItemsControlTests_Multiple.cs
@@ -1068,6 +1068,31 @@ namespace Avalonia.Controls.UnitTests.Primitives
Assert.Equal(1, target.SelectedItems.Count);
}
+ [Fact]
+ public void Adding_Selected_ItemContainers_Should_Update_Selection()
+ {
+ var items = new AvaloniaList(new[]
+ {
+ new ItemContainer(),
+ new ItemContainer(),
+ });
+
+ var target = new TestSelector
+ {
+ Items = items,
+ Template = Template(),
+ };
+
+ target.ApplyTemplate();
+ target.Presenter.ApplyTemplate();
+ items.Add(new ItemContainer { IsSelected = true });
+ items.Add(new ItemContainer { IsSelected = true });
+
+ Assert.Equal(2, target.SelectedIndex);
+ Assert.Equal(items[2], target.SelectedItem);
+ Assert.Equal(new[] { items[2], items[3] }, target.SelectedItems);
+ }
+
private IEnumerable SelectedContainers(SelectingItemsControl target)
{
return target.Presenter.Panel.Children
@@ -1120,5 +1145,11 @@ namespace Avalonia.Controls.UnitTests.Primitives
public List Items { get; }
public List SelectedItems { get; }
}
+
+ private class ItemContainer : Control, ISelectable
+ {
+ public string Value { get; set; }
+ public bool IsSelected { get; set; }
+ }
}
}