在WPF应用程序中,有一个包含多个对象的Grid
(网格),它们都是从自定义控件派生而来。我想使用上下文菜单对它们中的每一个执行一些操作:
<Grid.ContextMenu>
<ContextMenu>
<MenuItem Name="EditStatusCm" Header="Change status" Click="EditStatusCm_Click"/>
</ContextMenu>
</Grid.ContextMenu>
但是在事件处理程序中,我无法知道哪个对象被右键单击了:
private void EditStatusCm_Click(object sender, RoutedEventArgs e)
{
MyCustControl SCurrent = new MyCustControl();
MenuItem menu = sender as MenuItem;
SCurrent = menu.DataContext as MyCustControl; // here I get a run-time error
SCurrent.Status = MyCustControl.Status.Sixth;
}
在被注释的那一行代码上,调试器显示:对象引用未设置为对象的实例。
请帮忙看看,我的代码哪里出错了?
编辑(添加):
我尝试使用Command
方法来实现同样的功能:我声明了一个名为
DataCommands
的类,其中包含RoutedUICommand Requery
,然后使用了Window.CommandBindings
。<Window.CommandBindings>
<CommandBinding Command="MyNamespace:DataCommands.Requery" Executed="RequeryCommand_Executed"></CommandBinding>
</Window.CommandBindings>
现在 MenuItem 的 XAML 看起来像这样:
<Grid.ContextMenu>
<ContextMenu>
<MenuItem Name="EditStatusCm" Header="Change status" Command="MyNamespace:DataCommands.Requery"/>
</ContextMenu>
</Grid.ContextMenu>
事件处理程序的样子:
private void RequeryCommand_Executed(object sender, ExecutedRoutedEventArgs e)
{
IInputElement parent = (IInputElement)LogicalTreeHelper.GetParent((DependencyObject)sender);
MyCustControl SCurrent = new MyCustControl();
SCurrent = (MuCustControl)parent;
string str = SCurrent.Name.ToString();// here I get the same error
MessageBox.Show(str);
}
但调试器显示了相同的运行时错误:对象引用未设置为对象的实例。
我的两种方法缺少什么?
在WPF上下文菜单项点击事件处理程序中,我应该如何引用右键单击的对象?