You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF TreeView设置Collapsed隐藏项后残留空白行如何解决

问题根因

你当前的DataTrigger仅折叠了数据模板内部的KeyValueGrid元素,但每个TreeView子项外层由框架自动生成的TreeViewItem容器仍保留默认布局占位,因此项内容看不见了,但容器占的高度还在,就会出现空白行。

修复方案

方案1:直接控制TreeViewItem容器可见性(无需改ViewModel逻辑)

把可见性触发逻辑从DataTemplate内部移到ItemContainerStyle上,直接折叠整个项容器,就不会残留空白占位。修改后的完整XAML如下:

<TreeView Grid.Row="1" x:Name="ResSummTreeView" Background="Gray" ItemsSource="{Binding TreeItems}">
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate DataType="{x:Type VM:TreeItem}" ItemsSource="{Binding Items}">
            <TextBlock Text="{Binding Header}" Margin="0 5 0 5" Foreground="Wheat" FontWeight="Bold" FontSize="15"/>
            <HierarchicalDataTemplate.ItemTemplate>
                <DataTemplate DataType="{x:Type VM:KeyValue}">
                    <Grid Margin="0 5 5 0">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="*" />
                            <ColumnDefinition Width="*" />
                        </Grid.ColumnDefinitions>
                        <TextBlock Grid.Column="0" Text="{Binding Key}" TextWrapping="Wrap" Margin="0 0 15 0" Foreground="AliceBlue"/>
                        <TextBlock Grid.Column="1" Text="{Binding Value}" HorizontalAlignment="Right" TextWrapping="Wrap" Foreground="LightGreen"/>
                    </Grid>
                </DataTemplate>
            </HierarchicalDataTemplate.ItemTemplate>
            <!-- 二级子项容器样式,直接控制TreeViewItem可见性 -->
            <HierarchicalDataTemplate.ItemContainerStyle>
                <Style TargetType="TreeViewItem">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding Enabled}" Value="false">
                            <Setter Property="Visibility" Value="Collapsed"/>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </HierarchicalDataTemplate.ItemContainerStyle>
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>

方案2:数据源过滤(性能最优)

如果不需要保留隐藏项的选中、展开等状态,直接在ViewModel层把Enabled=false的项从绑定的Items集合中过滤掉,根本不生成对应的TreeViewItem容器,完全不会有布局残留问题,渲染性能也更好。如果需要动态切换显示状态,给Enabled属性加变更通知,在回调里更新集合即可。

内容的提问来源于stack exchange,提问作者Harxish

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 22:03:33