Browse Source

Tweak raising SelectedIndex/Item property changed.

Steven Kirk 5 years ago
parent
commit
5ac25a26f4

+ 1 - 1
src/Avalonia.Controls/Primitives/SelectingItemsControl.cs

@@ -613,7 +613,7 @@ namespace Avalonia.Controls.Primitives
                 RaisePropertyChanged(SelectedIndexProperty, _oldSelectedIndex, SelectedIndex);
                 _oldSelectedIndex = SelectedIndex;
             }
-            else if (e.PropertyName == nameof(ISelectionModel.SelectedItem))
+            else if (e.PropertyName == nameof(ISelectionModel.SelectedItem) && _oldSelectedItem != SelectedItem)
             {
                 RaisePropertyChanged(SelectedItemProperty, _oldSelectedItem, SelectedItem);
                 _oldSelectedItem = SelectedItem;

+ 26 - 16
src/Avalonia.Controls/Selection/SelectionModel.cs

@@ -345,7 +345,9 @@ namespace Avalonia.Controls.Selection
                 LostSelection(this, EventArgs.Empty);
             }
 
-            CommitOperation(update.Operation);
+            // Don't raise PropertyChanged events here as the OnSourceCollectionChanged event that
+            // let to this method being called will raise them if necessary.
+            CommitOperation(update.Operation, raisePropertyChanged: false);
         }
 
         private protected override CollectionChangeState OnItemsAdded(int index, IList items)
@@ -430,6 +432,11 @@ namespace Avalonia.Controls.Selection
                 RaisePropertyChanged(nameof(SelectedIndex));
             }
 
+            if (e.Action == NotifyCollectionChangedAction.Remove && e.OldStartingIndex <= oldSelectedIndex)
+            {
+                RaisePropertyChanged(nameof(SelectedItem));
+            }
+
             if (oldAnchorIndex != _anchorIndex)
             {
                 RaisePropertyChanged(nameof(AnchorIndex));
@@ -611,7 +618,7 @@ namespace Avalonia.Controls.Selection
             }
         }
 
-        private void CommitOperation(Operation operation)
+        private void CommitOperation(Operation operation, bool raisePropertyChanged = true)
         {
             try
             {
@@ -679,23 +686,26 @@ namespace Avalonia.Controls.Selection
                     }
                 }
 
-                if (oldSelectedIndex != _selectedIndex)
+                if (raisePropertyChanged)
                 {
-                    indexesChanged = true;
-                    RaisePropertyChanged(nameof(SelectedIndex));
-                    RaisePropertyChanged(nameof(SelectedItem));
-                }
+                    if (oldSelectedIndex != _selectedIndex)
+                    {
+                        indexesChanged = true;
+                        RaisePropertyChanged(nameof(SelectedIndex));
+                        RaisePropertyChanged(nameof(SelectedItem));
+                    }
 
-                if (oldAnchorIndex != _anchorIndex)
-                {
-                    indexesChanged = true;
-                    RaisePropertyChanged(nameof(AnchorIndex));
-                }
+                    if (oldAnchorIndex != _anchorIndex)
+                    {
+                        indexesChanged = true;
+                        RaisePropertyChanged(nameof(AnchorIndex));
+                    }
 
-                if (indexesChanged)
-                {
-                    RaisePropertyChanged(nameof(SelectedIndexes));
-                    RaisePropertyChanged(nameof(SelectedItems));
+                    if (indexesChanged)
+                    {
+                        RaisePropertyChanged(nameof(SelectedIndexes));
+                        RaisePropertyChanged(nameof(SelectedItems));
+                    }
                 }
             }
             finally