From 9a6cda66bcaa38fe58500320b5e16e71fcca07a2 Mon Sep 17 00:00:00 2001 From: Benedikt Schroeder Date: Sun, 29 Sep 2019 18:54:08 +0200 Subject: [PATCH 1/3] Add failing test for #2987 --- .../Primitives/SelectingItemsControlTests.cs | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) 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() { From bcbe9c3dbd6e2eb824b9947d667096d98edbaca5 Mon Sep 17 00:00:00 2001 From: Benedikt Schroeder Date: Wed, 18 Sep 2019 19:01:48 +0200 Subject: [PATCH 2/3] Fix setting SelectedIndex in XAML --- .../Primitives/SelectingItemsControl.cs | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/Avalonia.Controls/Primitives/SelectingItemsControl.cs b/src/Avalonia.Controls/Primitives/SelectingItemsControl.cs index cc0c5f52be..761a3f3b3d 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,16 @@ 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 = _updateSelectedIndex != int.MinValue ? _updateSelectedIndex : 0; + } } } From b42126b9e35cc5ce404963584fee95bc7f1b77c3 Mon Sep 17 00:00:00 2001 From: Benedikt Schroeder Date: Wed, 18 Sep 2019 19:22:23 +0200 Subject: [PATCH 3/3] Properly reset SelectedIndex after the DataContext changed --- src/Avalonia.Controls/Primitives/SelectingItemsControl.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Avalonia.Controls/Primitives/SelectingItemsControl.cs b/src/Avalonia.Controls/Primitives/SelectingItemsControl.cs index 761a3f3b3d..a50175bdee 100644 --- a/src/Avalonia.Controls/Primitives/SelectingItemsControl.cs +++ b/src/Avalonia.Controls/Primitives/SelectingItemsControl.cs @@ -1082,7 +1082,11 @@ namespace Avalonia.Controls.Primitives } else { - if (ItemCount > 0) + if (ItemCount == 0 && SelectedIndex != -1) + { + SelectedIndex = -1; + } + else { SelectedIndex = _updateSelectedIndex != int.MinValue ? _updateSelectedIndex : 0; }