首页 > 其他分享 >2023-7-27WPF的ContextMenu的传参绑定方式

2023-7-27WPF的ContextMenu的传参绑定方式

时间:2023-07-27 18:15:09浏览次数:38  
标签:传参 控件 绑定 Freezable PlacementTarget ContextMenu BindingProxy 27WPF

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站:【月长生殿主】

标签:传参,控件,绑定,Freezable,PlacementTarget,ContextMenu,BindingProxy,27WPF
From: https://www.cnblogs.com/WH5212/p/17585663.html

相关文章

  • 路由传参的两种方式
    1.param给将要跳转到的路由加占位{path:"/search/:keyword",component:Search,meta:{show:true}},goSearch(){this.$router.push("/search/"+this.keyword)......
  • 问题--链表指针传参,修改next指针只传值
    1.问题--链表指针传参,修改next指针只传值Link_creat_head(&head,p_new);//将新节点加入链表在这当中head头指针传的是地址,而p_new传的是值,这二者有什么区别?#include<stdio.h>#include<stdlib,h>//定义结点结构体typedefstructstudent{//数据域intnum;......
  • antd 组件 select input cheeckboxGround 传参 自定义传参
    tempfunclog:......
  • x86-64 汇编传参
    关于64位汇编的参数传递当参数少于7个时,参数从左到右放入寄存器:rdi,rsi,rdx,rcx,r8,r9。当参数为7个以上时,前6个与前面一样,但后面的依次从“右向左”放入栈中,即和32位汇编一样。参数个数大于7个的时候H(a,b,c,d,e,f,g,h);a->%rdi,b->%rsi,c->%r......
  • mysql 根据in 传参排序
    MySQL根据IN传参排序在MySQL中,我们经常需要根据给定的一组值来进行排序操作。而IN关键字正是用来筛选出一组指定值的数据。本文将详细介绍如何在MySQL中使用IN传参进行排序。什么是IN关键字IN关键字是MySQL中的一个操作符,用于指定一个值是否在一个指定的范围内。其基本语法如下:......
  • python的传参 self
    Python的传参self在Python中,我们经常会看到类的方法定义中的第一个参数是self。但是,对于初学者来说,这个self是一个比较迷惑的概念。本文将详细介绍Python中的self参数,并通过一些代码示例来加深理解。什么是selfself是一个约定俗成的命名,它表示对象自身。它是类的实例方法的第一......
  • 批量新增接口正确传参以及优化(含数组传参)
    需求页面: 接口文档说明: 单个新增计划传参: 批量新增计划传参:批量新增7月24日和8月1日的复制计划 接口优化:由于当前医生给指定的患者新增计划时,当前医生和患者都不会发生变化,批量新增时仅是新增多个计划时间,所以计划时间可以调整为数组进行传参接口文档优化: 单个计......
  • python __init__传参
    Python__init__传参在Python的类定义中,__init__是一个特殊的方法,它用于在创建类的实例时进行初始化操作。通过在__init__方法中传递参数,我们可以在创建实例时为对象提供初始值。本文将详细介绍Python中__init__方法的使用和传参方式,并提供一些示例代码帮助读者更好地理解。__ini......
  • java如何调用python.py文件并传参
    注意:java调用python.py文件并传参,在windows和linux中使用是不一样的我在windows操作系统中,java调用python文件并传参,是这样写的:完全没问题try{IntegertotalTestCaseCount=0;//传入python文件的参数:StringxmindFilePath,StringtestCaseKeyWo......
  • Vue路由新开页面跳转和传参传递
    需求:在后台管理系统首页列表项中,点击详情跳转到系统中指定菜单的路由要求新开窗口并需要带上参数查询。第一种方法:1const{id}=item;2letrouteUrl=this.$router.resolve({3path:'/xxx',//路由地址4query:{id}//参数信息5});6window.open(ro......