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
相关产品推荐
相关产品推荐

