示例: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个人主页-哔哩哔哩视频

相关推荐
波力海苔夹心脆6752 小时前
C# WPF 资源字典详解:ResourceDictionary、MergedDictionaries 与自定义控件案例
开发语言·c#·wpf·入门教程·resource·资源字典
陈仓主教3 小时前
# WPF CheckBox 控件详解与使用—WPF 中的控件(6)--复选框控件(CheckBox)
wpf
光泽雨2 天前
WPF 音视频四大核心方案对比
wpf·音视频
浪扼飞舟3 天前
WPF(数据绑定)
wpf
samble4 天前
从零搭建半导体设备上位机(四):单实例、启动流程与配置文件,App 里那 526 行到底在干什么
wpf·配置文件·单实例
浪扼飞舟4 天前
WPF(控件的继承树、内容控件、布局控件)
wpf
avi91117 天前
电影开源Jevdo - 源码介绍(vue版)没有android 和 没有wpf
android·wpf·框架·数据爬虫·meego·电影管理
吾与谁归in8 天前
C#脚本工具,支持智能提示自动补全(WPF + Roslyn + AvalonEdit)
开发语言·c#·wpf
昂好的day8 天前
WPF 从零入门(上):WPF 是什么、XAML 语法、布局与样式全解
开发语言·c#·wpf
影寂ldy9 天前
WPF导航窗体+Page页面跳转 知识点整理
wpf