示例:WPF中如何绑定ContextMenu和Menu

一、目的:开发过程中,有些模块的右键ContextMenu菜单是需要动态显示的,既是根据不同条件显示不同的菜单,很多是通过代码去生成ContextMenu的MenuItem,本文介绍通过绑定的方式去加载ContextMenu,Menu菜单栏的同样适用,原理同TreeView的绑定

二、效果

三、环境

VS2022

四、实现

实现代码

XML 复制代码
            <TextBlock Text="右键弹出菜单">
                <TextBlock.ContextMenu>
                    <ContextMenu ItemsSource="{local:ClassTypeTreeDataProvider IsRecursion=True, Type={x:Type FrameworkElement}}">
                        <ContextMenu.ItemContainerStyle>
                            <Style TargetType="MenuItem">
                                <Setter Property="Command" Value="{local:ShowDialogCommand}"/>
                                <Setter Property="CommandParameter" Value="{Binding Model}"/>
                            </Style>
                        </ContextMenu.ItemContainerStyle>
                        <ContextMenu.ItemTemplate>
                            <HierarchicalDataTemplate ItemsSource="{Binding Nodes}">
                                <DockPanel>
                                    <CheckBox VerticalAlignment="Center" IsChecked="{Binding IsChecked, Mode=TwoWay}" />
                                    <TextBlock  VerticalAlignment="Center" Text="{Binding Model.Name}" />
                                </DockPanel>
                            </HierarchicalDataTemplate>
                        </ContextMenu.ItemTemplate>
                    </ContextMenu>
                </TextBlock.ContextMenu>
            </TextBlock>

原理跟TreeView一样,应用ItemsSource绑定数据源,应用HierarchicalDataTemplate模板作为ItemTemplate来绑定,树结构的绑定参考文档

示例:WPF中TreeView自定义TreeNode泛型绑定对象-CSDN博客

示例:WPF中TreeView自定义TreeNode泛型绑定对象来实现级联勾选-CSDN博客

Menu的绑定原理一样

实现代码

XML 复制代码
            <Menu ItemsSource="{local:ClassTypeTreeDataProvider IsRecursion=True, Type={x:Type FrameworkElement}}">
                <Menu.ItemContainerStyle>
                    <Style TargetType="MenuItem">
                        <Setter Property="Command" Value="{local:ShowDialogCommand}"/>
                        <Setter Property="CommandParameter" Value="{Binding Model}"/>
                    </Style>
                </Menu.ItemContainerStyle>
                <Menu.ItemTemplate>
                    <HierarchicalDataTemplate ItemsSource="{Binding Nodes}">
                        <TextBlock  VerticalAlignment="Center" Text="{Binding Model.Name}" />
                    </HierarchicalDataTemplate>
                </Menu.ItemTemplate>
            </Menu>

当切换ItemsSource既可以实现动态切换ContextMenu

五、需要了解的知识点

ContextMenu 类 (System.Windows.Controls) | Microsoft Learn

Menu 类 (System.Windows.Controls) | Microsoft Learn

HierarchicalDataTemplate 类 (System.Windows) | Microsoft Learn

MenuItem 类 (System.Windows.Controls) | Microsoft Learn

ICommand 接口 (System.Windows.Input) | Microsoft Learn

六、源码地址

GitHub - HeBianGu/WPF-ControlDemo: 示例

GitHub - HeBianGu/WPF-ControlBase: Wpf封装的自定义控件资源库

GitHub - HeBianGu/WPF-Control: WPF轻量控件和皮肤库

七、了解更多

System.Windows.Controls 命名空间 | Microsoft Learn

https://github.com/HeBianGu

HeBianGu的个人空间-HeBianGu个人主页-哔哩哔哩视频

相关推荐
玖笙&3 天前
✨WPF编程基础【2.1】布局原则
c++·wpf·visual studio
玖笙&3 天前
✨WPF编程基础【2.2】:布局面板实战
c++·wpf·visual studio
SEO-狼术3 天前
.NET WPF 数据编辑器集合提供列表框控件
.net·wpf
FuckPatience7 天前
WPF 具有跨线程功能的UI元素
wpf
诗仙&李白7 天前
HEFrame.WpfUI :一个现代化的 开源 WPF UI库
ui·开源·wpf
He BianGu7 天前
【笔记】在WPF中Binding里的详细功能介绍
笔记·wpf
He BianGu7 天前
【笔记】在WPF中 BulletDecorator 的功能、使用方式并对比 HeaderedContentControl 与常见 Panel 布局的区别
笔记·wpf
123梦野8 天前
WPF——效果和可视化对象
wpf
He BianGu8 天前
【笔记】在WPF中Decorator是什么以及何时优先考虑 Decorator 派生类
笔记·wpf
时光追逐者8 天前
一款专门为 WPF 打造的开源 Office 风格用户界面控件库
ui·开源·c#·.net·wpf