динамически связывать MenuItem с элементом в списке - PullRequest
2 голосов
/ 30 ноября 2011

Я использую 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?

}

Ответы [ 3 ]

0 голосов
/ 30 ноября 2011
var clickedItem = e.OriginalSource as MenuItem;
MyObject myObj = MyList.Find(o => o.Name == clickedItem.Header);
0 голосов
/ 30 ноября 2011

Быстрый грязный хак, который соответствует коду, который у вас есть: используйте свойство 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;
}
0 голосов
/ 30 ноября 2011

Вы можете получить к нему доступ

MenuItem nItem = sender as MenuItem;
...