当前位置: 首页 > news >正文

ContextMenu的Item如何绑定命令

<UserControl x:Class="ATE.View.需求管理View"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:ATE.View"xmlns:i="http://schemas.microsoft.com/xaml/behaviors"xmlns:vm="clr-namespace:ATE.VM"mc:Ignorable="d"FontFamily="Microsoft YaHei"x:Name="root"d:DesignHeight="450" d:DesignWidth="800"><Grid><Grid.ColumnDefinitions><ColumnDefinition Width="*" /><ColumnDefinition Width="auto" /><ColumnDefinition Width="5*" /></Grid.ColumnDefinitions><GroupBox Grid.Column="0"Margin="10"Header="本地数据"><TreeView ItemsSource="{Binding RootNodes}"Tag="{Binding DataContext, ElementName=root}"x:Name="treeView"><TreeView.Resources><!-- 组节点模板 --><HierarchicalDataTemplate DataType="{x:Type vm:GroupNode}"ItemsSource="{Binding Children}"><StackPanel Orientation="Horizontal"x:Name="stackPanel"><Image Source="{Binding Icon}"Width="16"Height="16" /><TextBlock Text="{Binding Name}"Margin="5,0" /><StackPanel.ContextMenu><ContextMenu DataContext="{Binding PlacementTarget.Tag, RelativeSource={RelativeSource Self}}"><MenuItem Header="添加分组"Command="{Binding AddGroupCommand}"CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=ContextMenu},Path=PlacementTarget.DataContext}" /><MenuItem Header="添加元素"Command="{Binding AddElementCommand}"CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=ContextMenu},Path=PlacementTarget.DataContext}" /><Separator /><MenuItem Header="删除"Command="{Binding DeleteNodeCommand}"CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}, Path=PlacementTarget.DataContext}" /></ContextMenu></StackPanel.ContextMenu></StackPanel></HierarchicalDataTemplate><!-- 元素节点模板 --><DataTemplate DataType="{x:Type vm:ElementNode}"><StackPanel Orientation="Horizontal"Tag="{Binding DataContext, ElementName=root}"><Image Source="{Binding Icon}"Width="16"Height="16" /><TextBlock Text="{Binding Name}"Margin="5,0"FontStyle="Italic" /><StackPanel.ContextMenu><ContextMenu DataContext="{Binding PlacementTarget.Tag, RelativeSource={RelativeSource Self}}"><MenuItem Header="删除"Command="{Binding DeleteNodeCommand}"CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}, Path=PlacementTarget.DataContext}" />  </ContextMenu></StackPanel.ContextMenu></StackPanel></DataTemplate></TreeView.Resources></TreeView></GroupBox></Grid>
</UserControl>

首先要理解为什么不能直接绑定命令呢

正常情况,我们的控件都是在可视化树上,UserControl继承DataContext,一般都可以直接绑定,如果是一些定制化容器如ListBox,ItemsControl这种就需要用下面这种方法来绑定,但这些都是建立在控件在可视化树上

Command="{Binding RelativeSource={RelativeSource AncestorType=UserControl, Mode=FindAncestor}, Path=DataContext.EditUserCommand}" CommandParameter="{Binding}"

ContextMenu属于PopUp控件,不在可视化树上就不能用上述方法

如何绑定不在可视化树上的控件

用控件的tag来中转

上面那个例子,要绑定TreeView中的ContextMenu

首先要让ContextMenu的上层控件的tag来绑定UserControl的DataContext

<UserControl x:Class="ATE.View.需求管理View"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:ATE.View"xmlns:i="http://schemas.microsoft.com/xaml/behaviors"xmlns:vm="clr-namespace:ATE.VM"mc:Ignorable="d"FontFamily="Microsoft YaHei"x:Name="root"d:DesignHeight="450" d:DesignWidth="800">
<StackPanel Orientation="Horizontal"x:Name="stackPanel"Tag="{Binding DataContext, ElementName=root}">

为什么一定要上层控件能,因为ContextMenu里面有一个属性PlacementTarget,他指向的就是上层空间,ContextMenuStackPanel包裹,所以指向StackPanel

<ContextMenu DataContext="{Binding PlacementTarget.Tag, RelativeSource={RelativeSource Self}}"><MenuItem Header="删除"Command="{Binding DeleteNodeCommand}"CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}, Path=PlacementTarget.DataContext}" />  
</ContextMenu>

一定要用RelativeSource指向自己,如果不这样的话,Wpf会在可视化树中找PlacementTarget属性,很显然是找不到的,这样就可也绑定命令了,只有通过 PlacementTarget.DataContext,才能精确拿到你右键的那个节点。

http://www.dtcms.com/a/273490.html

相关文章:

  • 手机恢复出厂设置怎么找回数据?Aiseesoft FoneLab for Android数据恢复工具分享
  • 【音视频】HLS拉流抓包分析
  • 【mac】快捷键使用指南
  • Java 深入解析:JVM对象创建与内存机制全景图
  • uni-app获取手机当前连接的WIFI名称
  • 如何将文件从OPPO手机传输到电脑
  • 视频人脸处理——人脸面部动作提取
  • 虹科分享 | 告别实体钥匙!数字钥匙正在重构你的用车体验
  • 计算机毕业设计ssm基于JavaScript的餐厅点餐系统 SSM+Vue智慧餐厅在线点餐管理平台 JavaWeb前后端分离式餐饮点餐与桌台调度系统
  • 【前端】【组件库开发】【原理】【无框架开发】现代网页弹窗开发指南:从基础到优化
  • Python day58
  • rom定制系列------红米note10 5G版camellia原生安卓14批量线刷 miui安卓11修改型号root版
  • php use 命名空间与 spl_autoload_register的关系
  • Microsoft Word 中 .doc 和 .docx 的区别
  • 重构下一代智能电池“神经中枢”:GCKontrol定义高性能BMS系统级设计标杆
  • 2025年渗透测试面试题总结-2025年HW(护网面试) 41(题目+回答)
  • 基于开源AI智能名片链动2+1模式与S2B2C商城小程序的渠道选择策略研究
  • SpringDataRedis入门
  • 慕尚花坊项目笔记
  • ADSP-21489用SigmaStudio+(SS+)来做开发的详解六、T的用法
  • 工业通信升级新选择:耐达讯CCLINKIE转Modbus TCP网关
  • Vue 动态类名实战讲解
  • 生物化学(实验流程) PCR : 植物提取RNA 电泳评估RNA纯度
  • leetcode:377. 组合总和 Ⅳ[完全背包]
  • 在mac m1基于ollama运行deepseek r1
  • 静态POD是啥,如何理解,应用场景
  • 千辛万苦3面却倒在性格测试?这太离谱了吧!
  • 第十五章 STL(stack、queue、list、set、map容器使用)
  • 如何将 iPhone 文件传到 Mac?
  • C++11中的std::minmax与std::minmax_element:原理解析与实战