diff --git a/src/Avalonia.Controls/Primitives/SelectingItemsControl.cs b/src/Avalonia.Controls/Primitives/SelectingItemsControl.cs index cc0c5f52be..a50175bdee 100644 --- a/src/Avalonia.Controls/Primitives/SelectingItemsControl.cs +++ b/src/Avalonia.Controls/Primitives/SelectingItemsControl.cs @@ -304,6 +304,11 @@ namespace Avalonia.Controls.Primitives { base.ItemsCollectionChanged(sender, e); + if (_updateCount > 0) + { + return; + } + switch (e.Action) { case NotifyCollectionChangedAction.Add: @@ -1071,13 +1076,20 @@ namespace Avalonia.Controls.Primitives private void UpdateFinished() { - if (_updateSelectedIndex != int.MinValue) + if (_updateSelectedItem != null) { - SelectedIndex = _updateSelectedIndex; + SelectedItem = _updateSelectedItem; } - else if (_updateSelectedItem != null) + else { - SelectedItem = _updateSelectedItem; + if (ItemCount == 0 && SelectedIndex != -1) + { + SelectedIndex = -1; + } + else + { + SelectedIndex = _updateSelectedIndex != int.MinValue ? _updateSelectedIndex : 0; + } } } diff --git a/tests/Avalonia.Controls.UnitTests/Primitives/SelectingItemsControlTests.cs b/tests/Avalonia.Controls.UnitTests/Primitives/SelectingItemsControlTests.cs index 4e4d92afdc..8f27ebe853 100644 --- a/tests/Avalonia.Controls.UnitTests/Primitives/SelectingItemsControlTests.cs +++ b/tests/Avalonia.Controls.UnitTests/Primitives/SelectingItemsControlTests.cs @@ -109,6 +109,28 @@ namespace Avalonia.Controls.UnitTests.Primitives Assert.True(items[1].IsSelected); } + [Fact] + public void Setting_SelectedIndex_During_Initialize_Should_Select_Item_When_AlwaysSelected_Is_Used() + { + var listBox = new ListBox + { + SelectionMode = SelectionMode.Single | SelectionMode.AlwaysSelected + }; + + listBox.BeginInit(); + + listBox.SelectedIndex = 1; + var items = new AvaloniaList(); + listBox.Items = items; + items.Add("A"); + items.Add("B"); + items.Add("C"); + + listBox.EndInit(); + + Assert.Equal("B", listBox.SelectedItem); + } + [Fact] public void Setting_SelectedIndex_Before_ApplyTemplate_Should_Set_Item_IsSelected_True() {