Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将菜单项与列表中的项动态关联_C#_.net_Winforms_Contextmenu_Menuitem - Fatal编程技术网

C# 将菜单项与列表中的项动态关联

C# 将菜单项与列表中的项动态关联,c#,.net,winforms,contextmenu,menuitem,C#,.net,Winforms,Contextmenu,Menuitem,我使用C#,我有一个对象列表,我想在上下文菜单中显示所有对象,每个对象都显示为菜单项 单击一个菜单项时,我想在MenuItem\u Click()函数中引用关联的对象 List<MyObject> MyList = new List<MyObject>(); ContextMenu menu = new ContextMenu(); foreach(MyObject o in MyList) { MenuItem item = new MenuItem();

我使用C#,我有一个对象列表,我想在上下文菜单中显示所有对象,每个对象都显示为
菜单项

单击一个菜单项时,我想在
MenuItem\u Click()
函数中引用关联的对象

List<MyObject> MyList = new List<MyObject>();
ContextMenu menu = new ContextMenu();

foreach(MyObject o in MyList)
{
     MenuItem item = new MenuItem();
     item.Header = o.Name;
     item.Click += MenuItem_Click;
     menu.Items.add(item);
}

menu.IsOpen=true;

void MenuItem_Click(object sender, RoutedEventArgs e){

    // Assume the 5th MenuItem is clicked, I need to refer to the 5th object in MyList
    // how to do it?

}
List MyList=new List();
ContextMenu=新建ContextMenu();
foreach(MyList中的MyObject o)
{
MenuItem项=新MenuItem();
项目标题=o.名称;
item.Click+=MenuItem\u Click;
菜单.项目.添加(项目);
}
menu.IsOpen=true;
无效菜单项单击(对象发送方,路由目标){
//假设单击了第五个菜单项,我需要引用MyList中的第五个对象
//怎么做?
}
您可以通过

MenuItem nItem = sender as MenuItem;
你可以通过

MenuItem nItem = sender as MenuItem;

一个适合您当前拥有的代码的快速恶意攻击:使用
标记
属性

foreach(MyObject o in MyList)
{
    MenuItem item = new MenuItem();
    item.Header = o.Name;
    item.Tag = o;
    item.Click += MenuItem_Click;
    menu.Items.add(item);
}
然后,您可以通过以下方式引用它:

private void MenuItem_Click(object sender, RoutedEventArgs e)
{
    var myObj = (MyObject)((MenuItem)sender).Tag;
}

一个适合您当前拥有的代码的快速恶意攻击:使用
标记
属性

foreach(MyObject o in MyList)
{
    MenuItem item = new MenuItem();
    item.Header = o.Name;
    item.Tag = o;
    item.Click += MenuItem_Click;
    menu.Items.add(item);
}
然后,您可以通过以下方式引用它:

private void MenuItem_Click(object sender, RoutedEventArgs e)
{
    var myObj = (MyObject)((MenuItem)sender).Tag;
}

查看代码,item.Header==o.Name so MyList.Find(o=>o.Name==clickedItem.Header);答复updated@Dave,在我的例子中,名称不是一个安全的标识符,但我认为您的想法应该适用于其他情况;答复updated@Dave,在我的例子中,名字不是一个安全的标识符,但我认为你的想法应该适用于其他情况。尽管投了反对票,但这个解决方案确实在OP提供的框架内回答了OP的问题。这在我的例子中非常有效。我想知道为什么它被认为是“肮脏的”黑客行为……标签属性不应该做这样的事情吗?@Laz-标签是作为一个通用属性存在的,因为自从它在VB的控件中引入以来,它就一直被用于这类事情。就我个人而言,这不是我的首选方法,我会使用ListView进行数据绑定,并将每个TemplateItem作为MenuItem,然后以命令为目标(将绑定的MyObject作为CommandParameter传递)。如果我有时间的话,我可能会在今天晚些时候为你发布一个这样的示例。尽管投了反对票,但这个解决方案确实在OP提供的框架内回答了OP的问题。这在我的情况下非常有效。我想知道为什么它被认为是“肮脏的”黑客行为……标签属性不应该做这样的事情吗?@Laz-标签是作为一个通用属性存在的,因为自从它在VB的控件中引入以来,它就一直被用于这类事情。就我个人而言,这不是我的首选方法,我会使用ListView进行数据绑定,并将每个TemplateItem作为MenuItem,然后以命令为目标(将绑定的MyObject作为CommandParameter传递)。如果我有时间的话,我可能会在今天晚些时候为您发布一个示例。这是MenuItem,OP需要用于填充MenuItem的数据对象。这是MenuItem,OP需要用于填充MenuItem的数据对象。