C# WPF如何基于BindingList创建子菜单且不覆盖MenuItem原有样式
问题原因
你为动态生成的子菜单定义ItemContainerStyle时没有显式继承全局MenuItem样式,局部定义的无依赖Style会完全覆盖全局主题中定义的MenuItem样式逻辑,包括悬停、选中状态的触发器,因此主题切换时这部分子菜单的状态效果不会同步更新。
你之前尝试用ItemTemplate的写法本质错误:当MenuItem绑定ItemsSource时,WPF会自动为每个数据项生成MenuItem作为容器,你在DataTemplate中额外定义MenuItem自然会出现嵌套问题。
解决方案
直接给ItemContainerStyle添加BasedOn属性,继承全局的MenuItem样式即可,修改后的代码如下:
<MenuItem ItemsSource="{Binding AppViewModel.AllLanguagesItems}" Header="{Binding AppViewModel.AppSubtitles[top_menu_language]}"> <MenuItem.ItemContainerStyle> <Style TargetType="{x:Type MenuItem}" BasedOn="{StaticResource {x:Type MenuItem}}"> <Setter Property="Header" Value="{Binding DisplayName}"/> <Setter Property="Command" Value="{Binding ChangeLanguage}"/> </Style> </MenuItem.ItemContainerStyle> </MenuItem>
BasedOn="{StaticResource {x:Type MenuItem}}"会让局部Style复用全局主题中定义的所有MenuItem样式规则,你自定义的Setter仅会覆盖Header和Command两个属性,其余样式、状态触发器都会随全局主题切换同步更新,悬停效果异常的问题会直接解决。
内容的提问来源于stack exchange,提问作者Kaszub09
相关产品推荐
相关产品推荐

