Browse Source

Clear TreeView selection when items removed.

Steven Kirk 2 years ago
parent
commit
6e8faab217
2 changed files with 43 additions and 0 deletions
  1. 17 0
      src/Avalonia.Controls/TreeView.cs
  2. 26 0
      src/Avalonia.Controls/TreeViewItem.cs

+ 17 - 0
src/Avalonia.Controls/TreeView.cs

@@ -293,6 +293,23 @@ namespace Avalonia.Controls
             return TreeItemFromContainer(this, container);
         }
 
+        private protected override void OnItemsViewCollectionChanged(object? sender, NotifyCollectionChangedEventArgs e)
+        {
+            base.OnItemsViewCollectionChanged(sender, e);
+
+            switch (e.Action)
+            {
+                case NotifyCollectionChangedAction.Remove:
+                case NotifyCollectionChangedAction.Replace:
+                    foreach (var i in e.OldItems!)
+                        SelectedItems.Remove(i);
+                    break;
+                case NotifyCollectionChangedAction.Reset:
+                    SelectedItems.Clear();
+                    break;
+            }
+        }
+
         /// <summary>
         /// Subscribes to the <see cref="SelectedItems"/> CollectionChanged event, if any.
         /// </summary>

+ 26 - 0
src/Avalonia.Controls/TreeViewItem.cs

@@ -1,9 +1,11 @@
 using System;
 using System.Collections.Generic;
+using System.Collections.Specialized;
 using System.Linq;
 using Avalonia.Controls.Metadata;
 using Avalonia.Controls.Mixins;
 using Avalonia.Controls.Primitives;
+using Avalonia.Controls.Selection;
 using Avalonia.Controls.Templates;
 using Avalonia.Data;
 using Avalonia.Input;
@@ -289,6 +291,30 @@ namespace Avalonia.Controls
             }
         }
 
+        private protected override void OnItemsViewCollectionChanged(object? sender, NotifyCollectionChangedEventArgs e)
+        {
+            base.OnItemsViewCollectionChanged(sender, e);
+
+            if (_treeView is null)
+                return;
+
+            switch (e.Action)
+            {
+                case NotifyCollectionChangedAction.Remove:
+                case NotifyCollectionChangedAction.Replace:
+                    foreach (var i in e.OldItems!)
+                        _treeView.SelectedItems.Remove(i);
+                    break;
+                case NotifyCollectionChangedAction.Reset:
+                    foreach (var i in GetRealizedContainers())
+                    {
+                        if (i is TreeViewItem tvi && tvi.IsSelected)
+                            _treeView.SelectedItems.Remove(i.DataContext);
+                    }
+                    break;
+            }
+        }
+
         private static int CalculateDistanceFromLogicalParent<T>(ILogical? logical, int @default = -1) where T : class
         {
             var result = 0;