From c2b83d9909f341d7aac37bd15ae26e0d2407d882 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Fri, 24 Mar 2023 18:42:46 +0100 Subject: [PATCH] Defer TreeViewItem creation to TreeView. Fixes nodes not being selected correctly when parent node is expanded. --- src/Avalonia.Controls/TreeViewItem.cs | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/Avalonia.Controls/TreeViewItem.cs b/src/Avalonia.Controls/TreeViewItem.cs index 3ac157f727..a7ac41c153 100644 --- a/src/Avalonia.Controls/TreeViewItem.cs +++ b/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); + } /// 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);