Browse Source

Merge pull request #10785 from AvaloniaUI/fixes/treeview-selection

Fix TreeView selection
Max Katz 2 years ago
parent
commit
a019e3dc81

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

@@ -10,6 +10,7 @@ using Avalonia.Controls.Generators;
 using Avalonia.Controls.Primitives;
 using Avalonia.Input;
 using Avalonia.Input.Platform;
+using Avalonia.Layout;
 using Avalonia.Threading;
 using Avalonia.VisualTree;
 
@@ -163,6 +164,9 @@ namespace Avalonia.Controls
         {
             item.IsExpanded = true;
 
+            if (item.Presenter?.Panel is null)
+                (this.GetVisualRoot() as ILayoutRoot)?.LayoutManager.ExecuteLayoutPass();
+
             if (item.Presenter?.Panel is { } panel)
             {
                 foreach (var child in panel.Children)

+ 17 - 2
src/Avalonia.Controls/TreeViewItem.cs

@@ -90,8 +90,20 @@ namespace Avalonia.Controls
 
         internal TreeView? TreeViewOwner => _treeView;
 
-        protected internal override Control CreateContainerForItemOverride() => new TreeViewItem();
-        protected internal override bool IsItemItsOwnContainerOverride(Control item) => item is TreeViewItem;
+        protected internal override Control CreateContainerForItemOverride()
+        {
+            return EnsureTreeView().CreateContainerForItemOverride();
+        }
+
+        protected internal override bool IsItemItsOwnContainerOverride(Control item)
+        {
+            return EnsureTreeView().IsItemItsOwnContainerOverride(item);
+        }
+
+        protected internal override void PrepareContainerForItemOverride(Control container, object? item, int index)
+        {
+            EnsureTreeView().PrepareContainerForItemOverride(container, item, index);
+        }
 
         /// <inheritdoc/>
         protected override void OnAttachedToLogicalTree(LogicalTreeAttachmentEventArgs e)
@@ -283,6 +295,9 @@ namespace Avalonia.Controls
             return logical != null ? result : @default;
         }
 
+        private TreeView EnsureTreeView() => _treeView ??
+            throw new InvalidOperationException("The TreeViewItem is not part of a TreeView.");
+
         private void HeaderDoubleTapped(object? sender, TappedEventArgs e)
         {
             OnHeaderDoubleTapped(e);

File diff suppressed because it is too large
+ 287 - 593
tests/Avalonia.Controls.UnitTests/TreeViewTests.cs


Some files were not shown because too many files changed in this diff