动态地将MenuItem与List中的项关联起来

本文关键字:关联 起来 List MenuItem 动态 | 更新日期: 2023-09-27 18:16:07

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

当一个MenuItem被点击时,我想在MenuItem_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?
}

动态地将MenuItem与List中的项关联起来

适合当前代码的快速肮脏hack:使用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;
}

可以通过

访问
MenuItem nItem = sender as MenuItem;
var clickedItem = e.OriginalSource as MenuItem;
MyObject myObj = MyList.Find(o => o.Name == clickedItem.Header);