首页 > 其他分享 >【WPF】ContextMenu 控件

【WPF】ContextMenu 控件

时间:2023-04-01 18:12:56浏览次数:64  
标签:控件 PlacementTarget 绑定 RelativeSource ContextMenu WPF FindAncestor

ContextMenu无论定义在.cs或.xaml文件中,都不继承父级的DataContext,所以如果要绑定父级的DataContext,直接DataContext=“{Binding}”是行不通的

不能绑父级,但是能绑资源

 

第一步:定义一个中间类用来做资源对象

public class BindingProxy : Freezable
    {
        #region Overrides of Freezable
 
        protected override Freezable CreateInstanceCore()
        {
            return new BindingProxy();
        }
 
        #endregion
 
        public object Data
        {
            get { return (object)GetValue(DataProperty); }
            set { SetValue(DataProperty, value); }
        }
 
        public static readonly DependencyProperty DataProperty =
            DependencyProperty.Register("Data", typeof(object), typeof(BindingProxy), new UIPropertyMetadata(null));
    }

 第二步:引用命名空间,在控件中定义资源

1 <UserControl.Resources>
2         <libBinding:BindingProxy x:Key="BindingProxy" Data="{Binding}"/>
3     </UserControl.Resources>

第三步:绑定ContextMenu、MenuItem

(Button.Command 和 ContextMenu.IsOpen 的绑定部分可以不关注,这两个绑定是用来控制ContextMenu打开的)

<Button Command="{Binding Customfold}">
            <Button.ContextMenu>
                <ContextMenu DataContext="{Binding Data,Source={StaticResource BindingProxy}}"
                             ItemsSource="{Binding ItemModelCollection}"
                             IsOpen="{Binding OpenCustomfold,Mode=OneWay}">
                    <ContextMenu.ItemContainerStyle>
                        <Style TargetType="MenuItem">
                            <Setter Property="Header" Value="{Binding ...}"/>
                            <Setter Property="Command" Value="{Binding ...}"/>
                            <Setter Property="CommandParameter" Value="{Binding ...}"/>
                        </Style>
                    </ContextMenu.ItemContainerStyle>
                </ContextMenu>
            </Button.ContextMenu>
            <Image .../>
        </Button>

第四步:传递参数

ContextMenu是它自身视觉树的根节点,所以即使通过RelativeSource.FindAncestor也找不到要传递的参数。

解决:可以通过PlacementTarget解决。微软对PlacementTarget的解释是:获取或设置UIElement,当它打开时相对于它确定ContextMenu的位置。应该可以理解为放置此ContextMenu的UIElement。

CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}, Path=PlacementTarget}"

如果要传递Item,如ListBox的SelectedItem

CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu},Path=PlacementTarget.SelectedItem}"  

 

标签:控件,PlacementTarget,绑定,RelativeSource,ContextMenu,WPF,FindAncestor
From: https://www.cnblogs.com/cdaniu/p/17279019.html

相关文章

  • WinForm的Listbox控件实现拖拽数据功能
    WinForm的Listbox控件实现拖拽数据功能相关函数:MouseDownDragDropDragEnter思路:当左侧的空间鼠标按下(MouseDown)以后,触发DragDrop操作,然后移动到右侧控件中,将会触发右侧控件的DragEnter事件。右侧同理MouseDown:触发拖动操作DragDrop:从当前容器中拖拽动作完成时的操作(发......
  • C# 直接在子线程中对窗体上的控件操作是会出现异常
    https://www.bbsmax.com/A/MAzA8klpd9/ Form1里privatedelegatevoidDispMSGDelegate(intindex,stringMSG);publicvoidDispMsg(intiIndex,stringstrMsg){if(this.richTextBox1.InvokeRequired==false)......
  • Qt学习笔记9——P30-33. 自定义控件封装,鼠标事件,定时器
    P30.自定义控件封装P31.Qt中的鼠标事件P32.定时器1P33.定时器2P30.自定义控件封装(创建了新项目) 添加新的界面和类:右键项目的文件夹(顶层的文件)->Qt——Qt设计师界面类->“选择界面模板”选"Widget"->在"Classname"中取个类名(此案例中改成了SmallWidget)->别的没......
  • Qt学习笔记8——P26-28. ui中的一些控件(QTreeWidget, QTableWidget, 其他)
    P26.QTreeWidget树控件P27.QTableWidget控件P28.其他常用控件介绍P26.QTreeWidget树控件(创建了新项目) (ui界面)ItemWidgets(Item-Based)->TreeWidget把"TreeWidget"拖进界面后,如果想把此TreeWidget居中,选中最大的窗口(Widget),然后选工具栏中的"水平居中"或"垂直居......
  • 界面组件DevExpress WPF v22.2 - 工具栏、日程组件全新升级
    DevExpressWPF拥有120+个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpressWPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。无论是Office办公软件的衍伸产品,还是以数据为中心......
  • 使用UI Automation实现自动化测试 --微软提供的控件Pattern
    微软提供的控件PatternSystem.Windows.Automation命名空间System.Windows.Automation.BasePattern为控件模式类提供基实现System.Windows.Automation.DockPattern表示在某个停靠容器内公开其停靠属性的控件System.Windows.Automation.ExpandCollapsePatte......
  • Android中在控件上显示倒计时
    Android中在控件上显示倒计时Android中在控件上显示倒计时publicclassCountdownTimerActivityextendsActivity{privateTimeCounttime;privateButtonchecking;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){//TODOAuto-generatedmethodst......
  • 记录-开发WPF项目中的一个疑惑
    背景项目技术栈:C#,WPF当前我想要实现点击某个按钮就可以跳转到某个界面,翻阅了项目中的代码,看到了//按钮事件privatevoidBtn_Click(objectsender,RoutedEventArgse)......
  • winform串口控件serialPort1的使用
    serialPort1控件使用的关键点主要有三:1、配置串口号2、配置数据接收事件3、打开串口关键代码如下:1privatevoidForm1_Load(objectsender,EventArgse)2{3......
  • DevExpress WPF的电子表格组件,让您更快获得Excel体验(二)
    DevExpress WPF的Spreadsheet控件拥有读取、写入、转换XLSx、XLS、CSV和TXT文件的功能,并且为终端用户提供了当今最流行的办公生产力套件才能获得的UI体验。它包括与Ribbon......