设置IsExpanded属性后TreeView顶级项无法展开的问题排查
问题解决:WPF TreeView顶级项无法通过绑定展开
问题根源
你的递归逻辑已正确将所有父项的IsExpanded设为true,调试也能确认顶级项的属性值变化,但界面上顶级项不展开,核心原因是顶级TreeViewItem没有应用到你在HierarchicalDataTemplate中定义的ItemContainerStyle。
HierarchicalDataTemplate里的ItemContainerStyle仅作用于该模板生成的子级TreeViewItem,而TreeView的顶级项由ItemsSource直接生成,它们的样式不受模板内的ItemContainerStyle控制,因此顶级项的IsExpanded绑定并未生效。
解决方案
直接在ExtendedTreeView控件上添加ItemContainerStyle,为顶级项绑定IsExpanded属性:
修改后的TreeView XAML代码:
<userControls:ExtendedTreeView Grid.Column="1" Grid.Row="2" x:Name="myTreeView" ItemsSource="{Binding ReportItems}" SelectedItem_="{Binding SelectedItem, Mode=TwoWay}" ItemTemplateSelector="{StaticResource TreeViewTemplateSelector}"> <!-- 为顶级项添加IsExpanded绑定样式 --> <userControls:ExtendedTreeView.ItemContainerStyle> <Style TargetType="{x:Type TreeViewItem}"> <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}"/> </Style> </userControls:ExtendedTreeView.ItemContainerStyle> </userControls:ExtendedTreeView>
另外,文件模板属于叶子节点,无需设置ItemContainerStyle,可删除冗余代码:
<!--TreeView File Template--> <HierarchicalDataTemplate x:Key="FileTemplate"> <Grid> <TextBlock Text="{Binding Name}" FontStyle="Italic"> <TextBlock.Style> <Style TargetType="{x:Type TextBlock}"> <Style.Triggers> <DataTrigger Binding="{Binding SSRS_Subscriptions}" Value="0"> <Setter Property="Foreground" Value="Gray"/> </DataTrigger> </Style.Triggers> </Style> </TextBlock.Style> </TextBlock> </Grid> </HierarchicalDataTemplate>
验证效果
修改后,递归设置顶级项IsExpanded为true时:
- 顶级TreeViewItem通过TreeView的ItemContainerStyle绑定响应属性变化,自动展开
- 二级及以下项通过FolderTemplate内的样式正常绑定展开
- 所有父层级会自动展开,确保选中的报表项完全可见
内容的提问来源于stack exchange,提问作者Michael Rourk
相关产品推荐
相关产品推荐

