diff --git a/src/Avalonia.Controls/Primitives/SelectingItemsControl.cs b/src/Avalonia.Controls/Primitives/SelectingItemsControl.cs
index 6382a4a748..e22d03273a 100644
--- a/src/Avalonia.Controls/Primitives/SelectingItemsControl.cs
+++ b/src/Avalonia.Controls/Primitives/SelectingItemsControl.cs
@@ -533,7 +533,16 @@ namespace Avalonia.Controls.Primitives
protected internal override void ClearContainerForItemOverride(Control element)
{
base.ClearContainerForItemOverride(element);
- element.ClearValue(IsSelectedProperty);
+
+ try
+ {
+ _ignoreContainerSelectionChanged = true;
+ element.ClearValue(IsSelectedProperty);
+ }
+ finally
+ {
+ _ignoreContainerSelectionChanged = false;
+ }
}
///
diff --git a/tests/Avalonia.Controls.UnitTests/VirtualizingStackPanelTests.cs b/tests/Avalonia.Controls.UnitTests/VirtualizingStackPanelTests.cs
index 4be888f96d..ba4fb32067 100644
--- a/tests/Avalonia.Controls.UnitTests/VirtualizingStackPanelTests.cs
+++ b/tests/Avalonia.Controls.UnitTests/VirtualizingStackPanelTests.cs
@@ -367,6 +367,38 @@ namespace Avalonia.Controls.UnitTests
Assert.False(originalFocused.IsVisible);
}
+ [Fact]
+ public void Focused_Element_Losing_Focus_Does_Not_Reset_Selection()
+ {
+ using var app = App();
+ var (target, scroll, listBox) = CreateTarget(
+ styles: new[]
+ {
+ new Style(x => x.OfType())
+ {
+ Setters =
+ {
+ new Setter(ListBoxItem.TemplateProperty, ListBoxItemTemplate()),
+ }
+ }
+ });
+
+ listBox.SelectedIndex = 0;
+
+ var selectedContainer = target.GetRealizedElements().First()!;
+ selectedContainer.Focusable = true;
+ selectedContainer.Focus();
+
+ scroll.Offset = new Vector(0, 500);
+ Layout(target);
+
+ var newFocused = target.GetRealizedElements().First()!;
+ newFocused.Focusable = true;
+ newFocused.Focus();
+
+ Assert.Equal(0, listBox.SelectedIndex);
+ }
+
[Fact]
public void Removing_Range_When_Scrolled_To_End_Updates_Viewport()
{
@@ -776,7 +808,19 @@ namespace Avalonia.Controls.UnitTests
Optional itemTemplate = default,
IEnumerable