Browse Source

Merge pull request #2922 from AvaloniaUI/fixes/2901-alwaysselected-state

Fix AlwaysSelected selected state.
danwalmsley 6 years ago
parent
commit
16308d315d

+ 6 - 0
src/Avalonia.Controls/Generators/ItemContainerGenerator.cs

@@ -128,6 +128,12 @@ namespace Avalonia.Controls.Generators
                 }
 
                 Dematerialized?.Invoke(this, new ItemContainerEventArgs(startingIndex, result));
+
+                if (toMove.Count > 0)
+                {
+                    var containers = toMove.Select(x => x.Value).ToList();
+                    Recycled?.Invoke(this, new ItemContainerEventArgs(containers[0].Index, containers));
+                }
             }
 
             return result;

+ 3 - 2
src/Avalonia.Controls/Primitives/SelectingItemsControl.cs

@@ -979,13 +979,14 @@ namespace Avalonia.Controls.Primitives
             }
 
             var item = ElementAt(Items, index);
+            var itemChanged = !Equals(item, oldItem);
             var added = -1;
             HashSet<int> removed = null;
 
             _selectedIndex = index;
             _selectedItem = item;
 
-            if (oldIndex != index || _selection.HasMultiple)
+            if (oldIndex != index || itemChanged || _selection.HasMultiple)
             {
                 if (clear)
                 {
@@ -1022,7 +1023,7 @@ namespace Avalonia.Controls.Primitives
                     index);
             }
 
-            if (!Equals(item, oldItem))
+            if (itemChanged)
             {
                 RaisePropertyChanged(
                     SelectedItemProperty,

+ 19 - 0
tests/Avalonia.Controls.UnitTests/Primitives/SelectingItemsControlTests_AutoSelect.cs

@@ -102,6 +102,25 @@ namespace Avalonia.Controls.UnitTests.Primitives
             Assert.Null(target.SelectedItem);
         }
 
+        [Fact]
+        public void Removing_Selected_First_Item_Should_Select_Next_Item()
+        {
+            var items = new AvaloniaList<string>(new[] { "foo", "bar" });
+            var target = new TestSelector
+            {
+                Items = items,
+                Template = Template(),
+            };
+
+            target.ApplyTemplate();
+            target.Presenter.ApplyTemplate();
+            items.RemoveAt(0);
+
+            Assert.Equal(0, target.SelectedIndex);
+            Assert.Equal("bar", target.SelectedItem);
+            Assert.Equal(new[] { ":selected" }, target.Presenter.Panel.Children[0].Classes);
+        }
+
         private FuncControlTemplate Template()
         {
             return new FuncControlTemplate<SelectingItemsControl>((control, scope) =>