From b8686877afcbdd2016c622fe77895649a868c607 Mon Sep 17 00:00:00 2001 From: Andrey Kunchev Date: Tue, 27 Oct 2020 20:29:03 +0200 Subject: [PATCH 1/3] add failing test for issue #4945 --- .../Selection/InternalSelectionModelTests.cs | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/tests/Avalonia.Controls.UnitTests/Selection/InternalSelectionModelTests.cs b/tests/Avalonia.Controls.UnitTests/Selection/InternalSelectionModelTests.cs index ce3e698cf3..8701fc2479 100644 --- a/tests/Avalonia.Controls.UnitTests/Selection/InternalSelectionModelTests.cs +++ b/tests/Avalonia.Controls.UnitTests/Selection/InternalSelectionModelTests.cs @@ -232,6 +232,39 @@ namespace Avalonia.Controls.UnitTests.Selection Assert.Contains(nameof(target.SelectedItem), changed); } + [Fact] + public void Raises_Selection_Changed_On_Item_Move() + { + var items = new AvaloniaList(new[] { "foo", "bar", "baz" }); + var target = CreateTarget(source: items); + + target.SelectedIndex = 1; + + var changed = new List(); + + target.PropertyChanged += (s, e) => changed.Add(e.PropertyName); + + var oldSelectedIndex = target.SelectedIndex; + var oldSelectedItem = target.SelectedItem; + + + var sel = items[1]; + var other = items[2]; + + items[2] = sel; + items[1] = other; + + Assert.NotEqual(oldSelectedIndex, target.SelectedIndex); + Assert.NotEqual(oldSelectedItem, target.SelectedItem); + + Assert.Equal(-1, target.SelectedIndex); + Assert.Equal(null, target.SelectedItem); + + Assert.Contains(nameof(target.SelectedIndex), changed); + Assert.Contains(nameof(target.SelectedItem), changed); + } + + [Fact] public void Preserves_SelectedItem_On_Items_Reset() { From 53a06aed3b3f23e0ac05822b2047c7bd19179b7d Mon Sep 17 00:00:00 2001 From: Andrey Kunchev Date: Tue, 27 Oct 2020 20:40:49 +0200 Subject: [PATCH 2/3] fix notification for selected item in listbox issue #4945 --- src/Avalonia.Controls/Selection/SelectionModel.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Avalonia.Controls/Selection/SelectionModel.cs b/src/Avalonia.Controls/Selection/SelectionModel.cs index 054974e4f1..6ae53a4d59 100644 --- a/src/Avalonia.Controls/Selection/SelectionModel.cs +++ b/src/Avalonia.Controls/Selection/SelectionModel.cs @@ -443,6 +443,7 @@ namespace Avalonia.Controls.Selection } if ((e.Action == NotifyCollectionChangedAction.Remove && e.OldStartingIndex <= oldSelectedIndex) || + (e.Action == NotifyCollectionChangedAction.Replace && e.OldStartingIndex == oldSelectedIndex) || e.Action == NotifyCollectionChangedAction.Reset) { RaisePropertyChanged(nameof(SelectedItem)); From 50b2b3320c8625fb1a14e3bdc272fb833f4c9d3b Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Fri, 30 Oct 2020 15:17:19 +0100 Subject: [PATCH 3/3] Move test to existing test case. --- .../Selection/InternalSelectionModelTests.cs | 33 ------------------- .../Selection/SelectionModelTests_Multiple.cs | 7 ++++ .../Selection/SelectionModelTests_Single.cs | 7 ++++ 3 files changed, 14 insertions(+), 33 deletions(-) diff --git a/tests/Avalonia.Controls.UnitTests/Selection/InternalSelectionModelTests.cs b/tests/Avalonia.Controls.UnitTests/Selection/InternalSelectionModelTests.cs index 8701fc2479..ce3e698cf3 100644 --- a/tests/Avalonia.Controls.UnitTests/Selection/InternalSelectionModelTests.cs +++ b/tests/Avalonia.Controls.UnitTests/Selection/InternalSelectionModelTests.cs @@ -232,39 +232,6 @@ namespace Avalonia.Controls.UnitTests.Selection Assert.Contains(nameof(target.SelectedItem), changed); } - [Fact] - public void Raises_Selection_Changed_On_Item_Move() - { - var items = new AvaloniaList(new[] { "foo", "bar", "baz" }); - var target = CreateTarget(source: items); - - target.SelectedIndex = 1; - - var changed = new List(); - - target.PropertyChanged += (s, e) => changed.Add(e.PropertyName); - - var oldSelectedIndex = target.SelectedIndex; - var oldSelectedItem = target.SelectedItem; - - - var sel = items[1]; - var other = items[2]; - - items[2] = sel; - items[1] = other; - - Assert.NotEqual(oldSelectedIndex, target.SelectedIndex); - Assert.NotEqual(oldSelectedItem, target.SelectedItem); - - Assert.Equal(-1, target.SelectedIndex); - Assert.Equal(null, target.SelectedItem); - - Assert.Contains(nameof(target.SelectedIndex), changed); - Assert.Contains(nameof(target.SelectedItem), changed); - } - - [Fact] public void Preserves_SelectedItem_On_Items_Reset() { diff --git a/tests/Avalonia.Controls.UnitTests/Selection/SelectionModelTests_Multiple.cs b/tests/Avalonia.Controls.UnitTests/Selection/SelectionModelTests_Multiple.cs index 5d0c6d31e1..68bdbe51e8 100644 --- a/tests/Avalonia.Controls.UnitTests/Selection/SelectionModelTests_Multiple.cs +++ b/tests/Avalonia.Controls.UnitTests/Selection/SelectionModelTests_Multiple.cs @@ -1216,6 +1216,7 @@ namespace Avalonia.Controls.UnitTests.Selection var data = (AvaloniaList)target.Source!; var selectionChangedRaised = 0; var selectedIndexRaised = 0; + var selectedItemRaised = 0; var indexesChangedRaised = 0; target.Source = data; @@ -1227,6 +1228,11 @@ namespace Avalonia.Controls.UnitTests.Selection { ++selectedIndexRaised; } + + if (e.PropertyName == nameof(target.SelectedItem)) + { + ++selectedItemRaised; + } }; target.IndexesChanged += (s, e) => ++indexesChangedRaised; @@ -1249,6 +1255,7 @@ namespace Avalonia.Controls.UnitTests.Selection Assert.Equal(2, target.AnchorIndex); Assert.Equal(1, selectionChangedRaised); Assert.Equal(1, selectedIndexRaised); + Assert.Equal(1, selectedItemRaised); Assert.Equal(0, indexesChangedRaised); } diff --git a/tests/Avalonia.Controls.UnitTests/Selection/SelectionModelTests_Single.cs b/tests/Avalonia.Controls.UnitTests/Selection/SelectionModelTests_Single.cs index 66a2cef921..668af3b5d7 100644 --- a/tests/Avalonia.Controls.UnitTests/Selection/SelectionModelTests_Single.cs +++ b/tests/Avalonia.Controls.UnitTests/Selection/SelectionModelTests_Single.cs @@ -1040,6 +1040,7 @@ namespace Avalonia.Controls.UnitTests.Selection var data = (AvaloniaList)target.Source!; var selectionChangedRaised = 0; var selectedIndexRaised = 0; + var selectedItemRaised = 0; target.Source = data; target.Select(1); @@ -1050,6 +1051,11 @@ namespace Avalonia.Controls.UnitTests.Selection { ++selectedIndexRaised; } + + if (e.PropertyName == nameof(target.SelectedItem)) + { + ++selectedItemRaised; + } }; target.SelectionChanged += (s, e) => @@ -1070,6 +1076,7 @@ namespace Avalonia.Controls.UnitTests.Selection Assert.Equal(-1, target.AnchorIndex); Assert.Equal(1, selectionChangedRaised); Assert.Equal(1, selectedIndexRaised); + Assert.Equal(1, selectedItemRaised); } [Fact]