From 2fa8a8fcb2dc8ad353bfb893286e53976a4cef76 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Fri, 15 May 2026 00:13:38 +0200 Subject: [PATCH] OnIsVisibleChanged re-runs filter cascade on visible children MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When a tree node becomes visible for the first time, its already-realised children might carry stale IsHidden state — OnChildrenChanged only fires for newly-added children, and only when the parent was visible at the time. The visible result: a property's accessor children read as visible the first time the user expands the property even under ShowApiLevel=PublicOnly, until something else (refresh / language flip) forces a cascade. Assisted-by: Claude:claude-opus-4-7:Claude Code --- ILSpy/TreeNodes/ILSpyTreeNode.cs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/ILSpy/TreeNodes/ILSpyTreeNode.cs b/ILSpy/TreeNodes/ILSpyTreeNode.cs index 8f9b7c944..f429cd948 100644 --- a/ILSpy/TreeNodes/ILSpyTreeNode.cs +++ b/ILSpy/TreeNodes/ILSpyTreeNode.cs @@ -156,6 +156,24 @@ namespace ILSpy.TreeNodes } } + /// + /// Re-applies the filter cascade to every realised child when this node becomes + /// visible. only fires for newly-added children, and + /// only when the parent was visible at the time — so children added under a hidden + /// parent inherit stale states. Without this + /// trigger, expanding a node that ShowApiLevel had hidden leaves its accessor + /// children reading as visible even though the cascade would mark them hidden. + /// Mirrors WPF's identical override on ILSpyTreeNode. + /// + protected override void OnIsVisibleChanged() + { + base.OnIsVisibleChanged(); + if (!IsVisible) + return; + foreach (var child in Children.OfType()) + ApplyFilterToChild(child); + } + void ApplyFilterToChild(ILSpyTreeNode child) { var settings = CurrentLanguageSettings;