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