Browse Source

Clear TreeView selection when items removed.

pull/11404/head
Steven Kirk 3 years ago
parent
commit
6e8faab217
  1. 17
      src/Avalonia.Controls/TreeView.cs
  2. 26
      src/Avalonia.Controls/TreeViewItem.cs

17
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
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;

Loading…
Cancel
Save