WPF的ContextMenu的绑定方式

【作者】长生

ContextMenu为何不能正常绑定

在wpf中ContextMenu和ToolTip一样都是弹出层,与VisualTree已经分离了,只不过ToolTip在wpf中有进行特殊处理,所以可以正常绑定。


个人觉得ContextMenu绑定的最可靠的方式

  1. 首先添加BindingProxy类,继承Freezable,Freezable权限很高,可以实现可靠的数据绑定。
  2. 添加依赖属性object,方便传值。
    public class BindingProxy : Freezable
{
protected override Freezable CreateInstanceCore()
{
return new BindingProxy();
} public object Data
{
get { return (object)GetValue(DataProperty); }
set { SetValue(DataProperty, value); }
} // Using a DependencyProperty as the backing store for Data. This enables animation, styling, binding, etc...
public static readonly DependencyProperty DataProperty =
DependencyProperty.Register("Data", typeof(object), typeof(BindingProxy), new PropertyMetadata(null));
}
  1. 在xaml页面资源中添加命名空间,并添加控件绑定
xmlns:viewModel="clr-namespace:xxxxxxx"

<UserControl.Resources>
<viewModel:BindingProxy x:Key="runRecordList" Data="{Binding ElementName=runRecordList}" />//绑定到需要传值的控件
</UserControl.Resources>
  1. 在Context将改控件绑定到CommandParameter,即可对其进行传参。当然也可以直接绑定到ContextMenu上的DataContext,这样就可以直接对Command和ComandParameter进行绑定,再次我就不一一列举了。
 <DataGrid.ContextMenu>
<ContextMenu>
<MenuItem
Command="{Binding OpenCommand}"CommandParameter="{Binding Source={StaticResource runRecordList}, Path=Data.SelectedItem}"Header="打开" />
</ContextMenu>
</DataGrid.ContextMenu>
  1. 当然也可以引用外部资源DiscreteObjectKeyFrame进行绑定,方法和上述类似

使用PlacementTarget

在WPF中,PlacementTarget是一个属性,用于指定弹出式控件(如ContextMenu、ToolTip等)的放置目标。它定义了弹出式控件相对于哪个元素进行定位和显示。

PlacementTarget属性通常用于设置弹出式控件的放置位置。例如,当使用ContextMenu时,可以将ContextMenu的PlacementTarget属性设置为一个控件,以便在该控件上右键单击时显示ContextMenu。这样,ContextMenu将相对于该控件进行定位并显示。

  <ListBox.ContextMenu>
<ContextMenu DataContext="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}">
<MenuItem Command="{Binding DeleteCommand}" CommandParameter="{Binding RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}}, Path=PlacementTarget.SelectedItem.Id}" Header="删除" />
</ContextMenu>
</ListBox.ContextMenu>

结尾

感谢您的阅读,如果有收获麻烦点个关注!

其他平台

公众号:【长生小殿】

B站:【月长生殿主】

2023-7-27WPF的ContextMenu的传参绑定方式的更多相关文章

  1. Vue-cli中axios传参的方式以及后端取的方式

    0917自我总结 Vue-cli中axios传参的方式以及后端取的方式 一.传参 params是添加到url的请求字符串中的,用于get请求. data是添加到请求体(body)中的, 用于post请 ...

  2. 以传参的方式执行shell(模板)

    以传参的方式执行shell(模板) #!bin/bash # USE: Template # author : xiaowei # -- # state : -name 选项必选,,, -v -m 选 ...

  3. 使用HTTP协议向服务器传参的方式及django中获取参数的方式

    使用HTTP协议向服务器传参的四种方式 URL路径携带参数,形如/weather/beijing/2018; 查询字符串(query string),形如key1=value1&key2=va ...

  4. router-link传参 query方式

    router.js内的路由配置 { path: '/CreateProgress', name: 'CreateProgress', component:CreateProgress }   传参(q ...

  5. vue父子组件路由传参的方式

    一.get方式(url传参): 1.动态路由传参: 父组件: selectItem (item) { this.$router.push({ path: `/recommend/${item.id}` ...

  6. vue中路由传参的方式

    一.params的类型: 配置路由格式: /router/:id 传递的方式: 在path后面跟上对应的值 传递后形成的路径: /router/123, /router/abc 通过:to字符串拼接的 ...

  7. C++ 传参的方式 值传递,指针传递,引用传递

    关于传参总是搞晕,这里总结下: 值传递: void func(int n) { } void main() { int x = 1; func(x); return; } 这种就是值传递,在func函 ...

  8. Asp.Net中ObjectDataSource控件传参绑定数据

    最近在实习,在上头交付的任务中,由于需要使用Asp.Net的ListView控件,因此必然得就使用了ObjectDataSource控件,由于在使用过程中,需要网页中的参数发送到后台后,运行该参数进行 ...

  9. 点击div 跳转并通过URL传参

    点击div前要先给div绑定要传的参数: //给panel绑定自定义属性,方便在跳转时传带参数,键/值对排列 panel.attr("user_age",user_age); pa ...

  10. ★★★Oracle sql 传参特别注意★★★

    最近遇到一个非常烦人的问题,用传参的方式执行sql语句结果老是报 Oracle ORA-01722: 无效数字 一直无法找到原因. 表结构大致如下: table test_station ( tblR ...

随机推荐

  1. 自定义Python版本ESL库访问FreeSWITCH

    环境:CentOS 7.6_x64Python版本:3.9.12FreeSWITCH版本 :1.10.9 一.背景描述 ESL库是FreeSWITCH对外提供的接口,使用起来很方便,但该库是基于C语言 ...

  2. 执行sql报lock wait timeout exceeded; try restarting transaction

    mysql查询时候报错: Lock wait timeout exceeded; try restarting transaction 译文:锁等待超时;试着重新启动事务 被锁了,需要解锁. 1.in ...

  3. Vue+echarts实现中国地图射线效果

    效果图如上 前提是安装Echarts并引入 并且配置中国地图json文件这些都在同账号另一篇博客上有说明,查看请自行移步 下展示代码 <template> <div class=&q ...

  4. Python 字典嵌套

    字典嵌套 含义:将一系列字典存储在列表中,或将列表作为值存储在字典中 在列表中嵌套字典.在字典中嵌套列表.在字典中嵌套字典 字典列表 创建多个字典,将字典存放在列表中 使用range()自动生成多个字 ...

  5. 关于 static

    由static定义的被称为类属性 例如(  static String company = "博客园"  ) 类方法 例如(  public static void printCo ...

  6. 揭秘Karmada百倍集群规模多云基础设施体系

    摘要:本文结合Karmada社区对大规模场景的思考,揭示Karmada稳定支持100个大规模集群.管理超过50万个节点和200万个Pod背后的原理 本文分享自华为云社区<Karmada百倍集群规 ...

  7. 2022-06-18:golang与 C++数据结构类型对应关系是怎样的?

    2022-06-18:golang与 C++数据结构类型对应关系是怎样的? 答案2022-06-18: uintptr和unsafe.Pointer相当于c++的void*,也就是任意指针. uint ...

  8. 2022-03-09:我们正在玩一个猜数游戏,游戏规则如下: 我从 1 到 n 之间选择一个数字。 你来猜我选了哪个数字。 如果你猜到正确的数字,就会 赢得游戏 。 如果你猜错了,那么我会告诉你,我选

    2022-03-09:我们正在玩一个猜数游戏,游戏规则如下: 我从 1 到 n 之间选择一个数字. 你来猜我选了哪个数字. 如果你猜到正确的数字,就会 赢得游戏 . 如果你猜错了,那么我会告诉你,我选 ...

  9. @csrf_exempt

    在Django中对于基于函数的视图我们可以 @csrf_exempt 注解来标识一个视图可以被跨域访问.那么对于基于类的视图,我们应该怎么办呢? 简单来说可以有两种访问来解决 方法一:在类的 disp ...

  10. IntelliJ IDEA上手这一篇就够了,从入门到上瘾

    前言 每次换电脑,最最最头疼的事情莫过于安装各种软件和搭建开发环境.这算是不想换电脑的一个原因吧(最主要还是穷).除非是电脑坏了开不了机或者点一下卡一下,真不想换电脑.每次换电脑都得折腾好久. 趁着这 ...