WPF自定义上下文菜单子菜单不显示问题求助
WPF上下文菜单子菜单不显示的解决方案
刚帮你排查了代码,子菜单无法显示的核心问题在于内层用了ItemsControl而非原生Menu控件,加上模板嵌套方式的小问题,导致HierarchicalDataTemplate的层级绑定没生效。咱们一步步来修正:
问题出在哪?
ItemsControl只是基础的项容器,不支持菜单的层级展开逻辑,没法识别HierarchicalDataTemplate里的子项绑定- 你在
HierarchicalDataTemplate里直接嵌套MenuItem,会造成控件层级冲突,反而干扰了原生菜单的子项处理逻辑
修正后的XAML代码
把内层的ItemsControl换成Menu,同时简化模板写法,就能解决问题:
<CollectionViewSource Source="{Binding MenuItemsCollection}" x:Key="MenuSources"/> <ControlTemplate x:Key="ContextMenu" TargetType="{x:Type ContextMenu}"> <Border BorderThickness="1" BorderBrush="SteelBlue"> <ItemsControl ItemsSource="{Binding Source={StaticResource MenuSources}}" > <ItemsControl.ItemsPanel> <ItemsPanelTemplate> <StackPanel Orientation="Horizontal" Background="Ivory"/> </ItemsPanelTemplate> </ItemsControl.ItemsPanel> <ItemsControl.ItemTemplate> <DataTemplate> <Border BorderThickness=".5" BorderBrush="Black"> <!-- 替换内层ItemsControl为Menu控件,它天生支持层级菜单 --> <Menu ItemsSource="{Binding}" Background="Ivory"> <Menu.ItemTemplate> <!-- 简化模板:不需要手动写MenuItem,Menu会自动生成 --> <HierarchicalDataTemplate DataType="{x:Type local:MenuItemViewModel}" ItemsSource="{Binding MenuItems}"> <TextBlock Text="{Binding Header}"/> </HierarchicalDataTemplate> </Menu.ItemTemplate> </Menu> </Border> </DataTemplate> </ItemsControl.ItemTemplate> </ItemsControl> </Border> </ControlTemplate>
关键改动说明
- 用Menu替代内层ItemsControl:
Menu控件原生支持菜单层级,能正确解析HierarchicalDataTemplate的ItemsSource绑定,自动创建带展开功能的子菜单 - 简化HierarchicalDataTemplate:不需要在模板里手动嵌套
MenuItem,Menu会为每个数据项自动生成MenuItem,咱们只需要定义菜单项的显示内容(这里用TextBlock展示Header) - 保留原有布局逻辑:外层的
ItemsControl和横向StackPanel完全保留,继续实现你需要的两列菜单布局
关于你的C#代码
你的MenuItemViewModel和MenuItemsCollection的数据初始化代码是完全没问题的,结构清晰正确,修正XAML后就能正常显示父菜单和对应的子菜单了。
内容的提问来源于stack exchange,提问作者Jabir E
相关产品推荐
相关产品推荐

