private/output/New-DictionarySubTab.ps1

<#
.SYNOPSIS
    Creates a Key/Value DataGrid sub-tab for dictionary-type items.
#>

function New-DictionarySubTab {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [System.Collections.IList]$GroupItems,
        
        [Parameter(Mandatory)]
        [string]$TypeName,
        
        [Parameter(Mandatory)]
        [hashtable]$Colors,
        
        [switch]$IsDictionaryEntry
    )
    
    # Create styled DataGrid (no sort for dictionaries)
    $subGrid = New-StyledDataGrid -NoSort
    $subGrid.AutoGenerateColumns = $false
    
    $keyCol = [System.Windows.Controls.DataGridTextColumn]::new()
    $keyCol.Header = 'Key'
    $keyCol.Binding = [System.Windows.Data.Binding]::new('Key')
    [void]$subGrid.Columns.Add($keyCol)
    
    $valCol = New-ExpandableValueColumn -Colors $Colors
    [void]$subGrid.Columns.Add($valCol)
    
    $list = [System.Collections.Generic.List[object]]::new()
    
    if ($IsDictionaryEntry) {
        # DictionaryEntry items - each item is a key/value pair
        foreach ($entry in $GroupItems) {
            $rawVal = $entry.Value
            $displayValue = ConvertTo-DisplayValue -Value $rawVal
            $isExpandable = ($rawVal -is [System.Collections.IDictionary]) -or ($rawVal -is [array])
            $list.Add([PSCustomObject]@{
                Key           = $entry.Key
                Value         = $displayValue
                _RawValue     = $rawVal
                _IsExpandable = $isExpandable
                _SearchText   = "$($entry.Key) $displayValue"
            })
        }
    }
    else {
        # IDictionary items - each item is a full dictionary, enumerate its keys
        foreach ($dict in $GroupItems) {
            foreach ($key in $dict.Keys) {
                $rawVal = $dict[$key]
                $displayValue = ConvertTo-DisplayValue -Value $rawVal
                $isExpandable = ($rawVal -is [System.Collections.IDictionary]) -or ($rawVal -is [array])
                $list.Add([PSCustomObject]@{
                    Key           = $key
                    Value         = $displayValue
                    _RawValue     = $rawVal
                    _IsExpandable = $isExpandable
                    _SearchText   = "$key $displayValue"
                })
            }
        }
    }
    
    $observable = [System.Collections.ObjectModel.ObservableCollection[object]]::new($list)
    $subGrid.ItemsSource = [System.Windows.Data.CollectionViewSource]::GetDefaultView($observable)
    
    # Store unfiltered items and observable for collection-based filtering
    $subGrid.Tag = @{
        UnfilteredItems = $list
        Observable      = $observable
    }
    
    Add-DictionaryValuePopupHandler -DataGrid $subGrid
    
    $subTab = [System.Windows.Controls.TabItem]::new()
    $subTab.Header = "$TypeName ($($GroupItems.Count))"
    Set-TabItemStyle -TabItem $subTab
    $subTab.Content = $subGrid
    $subTab.Tag = 'Dictionary'
    
    return @{
        Tab      = $subTab
        DataGrid = $subGrid
    }
}