如何在WPF上下文菜单项单击事件处理程序中引用右键单击对象?在WPF应用程序中,有一个包含许多对象的网格(它们来自自定义控件)。我想使用上下文菜单对每个操作执行一些操作:但是在事件处理程序中,我不知道右键单击了哪些对象:privatevoidEditStatusCm_Click(objectsender,RoutedEventArgse){MenuItemmenu=senderasMenuItem;SCurrent=menu.DataContextasMyCustControl;//这里我得到一个运行时错误SCurrent.Status=MyCustControl.Status.Sixth;在该注释行上,调试器说:对象引用未设置为的对象实例。请帮忙,我的代码有什么问题?编辑(补充):我尝试用Command方法做同样的事情:我用RoutedUICommandRequery声明了一个RoutedUICommandRequery类,然后使用Window.CommandBindingsMenuItem的XAML现在看起来像:事件处理程序看起来像这样:privatevoidRequeryCommand_Executed(对象发送者,ExecutedRoutedEventArgse){IInputElementparent=(IInputElement)LogicalTreeHelper.GetParent((DependencyObject)sender);MyCustControlSCurrent=newMyCustControl();SCurrent=(MuCustControl)parent;字符串str=SCurrent.Name.ToString();//这里我得到同样的错误MessageBox.Show(str);但是调试器显示相同的运行时错误:未将对象引用设置为对象的实例。我在这两种方法中都缺少什么?我应该如何在WPF上下文菜单项单击事件处理程序中引用右键单击的对象?注意CommandParameter并在处理程序中使用它来确定它是哪个网格privatevoidEditStatusCm_Click(objectsender,RoutedEventArgse){if(mi!=null){ContextMenucm=mi.CommandParameterasContextMenu;if(cm!=null){Gridg=cm.PlacementTargetasGrid;如果(g!=null){Console.WriteLine(g.Background);//将打印红色}}}}更新:如果您希望menuitem处理该程序转到Grid的子节点而不是Grid本身,使用此方法只需将TextBlocks替换为您的自定义对象类型。然后在事件处理程序中,将Gridg=cm.PlacementTargetasGrid替换为Gridg=cm.PlacementTargetasGrid和TextBlockt=cm.PlacementTargetasTextBlock(或任何自定义对象类型)。通过在xaml中绑定数据上下文:ContextMenuDataContext="{BindingPlacementTarget.DataContext,RelativeSource={RelativeSourceSelf}}">然后你可以这样做:privatevoidContext_MenuClick(objectsender,RoutedEventArgse){varmenuItem=e.来源为MenuItem;MyDoStuffFunction(menuItem.DataContext);数据上下文将绑定到单击以打开ContextMenu的对象。我从这个链接的代码项目文章中得到它:http://www.codeproject.com/Articles/162784/WPF-ContextMenu-Strikes-Again-DataContext-Not-Updamenu=senderasMenuItemifthesenderisnotMenuItem或其派生类menu=senderasMenuItem将为null。随后取消引用菜单的尝试将会爆炸。您的发送者可以是Menu或ContextMenu或ToolStripMenuItem或其他形式的菜单项,而不是具体的MenuItem对象。使用调试器断点在此处停止代码并检查发送者对象以查看它到底是什么类。对于RoutedEventArgs所以.Sender应该是答案。但是要看菜单项是如何添加和绑定的看看这个答案集,选择适合自己情况的方法吧!你不应该检查RoutedEventArgs.Source而不是发件人吗?你有两个不同的问题。这两个问题都导致相同的异常,但在其他方面无关:第一个问题在你的第一种方法中,你的代码是正确的并且工作正常,除了这里:SCurrent.Status=MyCustControl.Status.Sixth;名称“Status”可作为静态成员和实例成员使用。我认为您错误地将代码剪切并粘贴到您的问题中。可能还需要添加以下MenuItemmenu=senderasMenuItem;在MenuItemmenu=senderasMenuItem之后;,取决于你的情况:if(menu==null)return;第二个问题在你的第二种方法中,你使用“From”而不是“e.Source”。以下代码按预期工作:privatevoidRequeryCommand_Executed(objectsender,ExecutedRoutedEventArgse){//在MyCustControl上面的行中将“发件人”更改为“e.Source”SCurrent=newMyCustControl();SCurrent=(MuCustControl)parent;stringstr=SCurrent.Name.ToString();//错误消失MessageBox.Show(str);}Finalnote注意:如果使用command方法,则没有理由将CommandParameter绑定到此。它明显更慢并且需要更多代码。e.Source永远是源对象,所以没必要用CommandParameter,就用吧。这对我有用:-XAML:-添加菜单项:-foreach(StringsincolumnNames){varitem=newMenuItem{IsCheckable=true,IsChecked=true,Header=s};AddColumnsContextMenu.Items.Add(项目);}监听器来了:-privatevoidAddColumnsContextMenu_Click(objectsender,RoutedEventArgse){字符串标题=mi.Header.ToString();MessageBox.Show("选中"+标题);}谢谢...在我的例子中,我能够使用:以上是C#学习教程:如何在WPF上下文菜单项单击事件处理程序中引用右键单击的对象?如果分享的内容对你有用,需要了解更多C#学习教程,希望你多多关注——privatevoidMenuItem_Click(objectsender,RoutedEventArgse){ContextMenuparent=menuItem.ParentasContextMenu;ListBoxItemselectedItem=parent.PlacementTargetasListBoxItem;}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
