diff --git a/src/Avalonia.Controls.TreeDataGrid/Primitives/TreeDataGridPresenterBase.cs b/src/Avalonia.Controls.TreeDataGrid/Primitives/TreeDataGridPresenterBase.cs index b95dd152..94bdfd66 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; @@ -729,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) 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");