From 00781d3202276fe508d3266accf2fbe0f4cbec32 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Fri, 16 May 2025 11:07:13 +0100 Subject: [PATCH 1/3] fix dynamic resources not propagating into TDG cells and headers because the logical children are not wired up. --- .../Primitives/TreeDataGridPresenterBase.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Avalonia.Controls.TreeDataGrid/Primitives/TreeDataGridPresenterBase.cs b/src/Avalonia.Controls.TreeDataGrid/Primitives/TreeDataGridPresenterBase.cs index b95dd152..6d8a97be 100644 --- a/src/Avalonia.Controls.TreeDataGrid/Primitives/TreeDataGridPresenterBase.cs +++ b/src/Avalonia.Controls.TreeDataGrid/Primitives/TreeDataGridPresenterBase.cs @@ -636,6 +636,7 @@ private Control GetRecycledOrCreateElement(IReadOnlyList items, int index if (e.GetVisualParent() is null) { ((ISetLogicalParent)e).SetParent(this); + LogicalChildren.Add(e); VisualChildren.Add(e); } return e; From 2e043196746ef55b6a70d4d06b80e150c64064b6 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Fri, 16 May 2025 11:07:53 +0100 Subject: [PATCH 2/3] ensure removal from logical tree as unrealized items are trimmed. --- .../Primitives/TreeDataGridPresenterBase.cs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/Avalonia.Controls.TreeDataGrid/Primitives/TreeDataGridPresenterBase.cs b/src/Avalonia.Controls.TreeDataGrid/Primitives/TreeDataGridPresenterBase.cs index 6d8a97be..94bdfd66 100644 --- a/src/Avalonia.Controls.TreeDataGrid/Primitives/TreeDataGridPresenterBase.cs +++ b/src/Avalonia.Controls.TreeDataGrid/Primitives/TreeDataGridPresenterBase.cs @@ -730,6 +730,21 @@ private void TrimUnrealizedChildren() } } } + + var logicalChildren = LogicalChildren; + + if (logicalChildren.Count > count) + { + for (var i = logicalChildren.Count - 1; i >= 0; --i) + { + var child = logicalChildren[i]; + + if (child is Visual { IsVisible: false }) + { + logicalChildren.RemoveAt(i); + } + } + } } private void OnItemsCollectionChanged(object? sender, NotifyCollectionChangedEventArgs e) From d50c5cfacdbf7e04bf853139c717a814b6bb28c5 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Fri, 16 May 2025 11:08:50 +0100 Subject: [PATCH 3/3] (optional) add the presenters to the logical tree so that users can inspect column headers and rows in the logical tree. --- .../Primitives/TreeDataGridRow.cs | 5 +++++ src/Avalonia.Controls.TreeDataGrid/TreeDataGrid.cs | 10 +++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/Avalonia.Controls.TreeDataGrid/Primitives/TreeDataGridRow.cs b/src/Avalonia.Controls.TreeDataGrid/Primitives/TreeDataGridRow.cs index 7f345e48..dfbbe928 100644 --- a/src/Avalonia.Controls.TreeDataGrid/Primitives/TreeDataGridRow.cs +++ b/src/Avalonia.Controls.TreeDataGrid/Primitives/TreeDataGridRow.cs @@ -138,6 +138,11 @@ protected override void OnApplyTemplate(TemplateAppliedEventArgs e) base.OnApplyTemplate(e); CellsPresenter = e.NameScope.Find("PART_CellsPresenter"); + if (CellsPresenter is { }) + { + LogicalChildren.Add(CellsPresenter); + } + if (RowIndex >= 0) CellsPresenter?.Realize(RowIndex); } diff --git a/src/Avalonia.Controls.TreeDataGrid/TreeDataGrid.cs b/src/Avalonia.Controls.TreeDataGrid/TreeDataGrid.cs index 1a8728a6..1715ec4f 100644 --- a/src/Avalonia.Controls.TreeDataGrid/TreeDataGrid.cs +++ b/src/Avalonia.Controls.TreeDataGrid/TreeDataGrid.cs @@ -321,8 +321,16 @@ protected override void OnApplyTemplate(TemplateAppliedEventArgs e) } base.OnApplyTemplate(e); - ColumnHeadersPresenter = e.NameScope.Find("PART_ColumnHeadersPresenter"); + ColumnHeadersPresenter = + e.NameScope.Find("PART_ColumnHeadersPresenter"); RowsPresenter = e.NameScope.Find("PART_RowsPresenter"); + + if (ColumnHeadersPresenter is { }) + LogicalChildren.Add(ColumnHeadersPresenter); + + if(RowsPresenter is { }) + LogicalChildren.Add(RowsPresenter); + Scroll = e.NameScope.Find("PART_ScrollViewer"); _headerScroll = e.NameScope.Find("PART_HeaderScrollViewer");