使用列表中的循环中的单击事件处理程序创建菜单项

时间:2012-10-10 14:54:01

标签: c# wpf event-handling menuitem

我想从列表中循环创建一些菜单项。 我这样试过:

MenuItem mnuItemDepth = new MenuItem();
foreach (ClassDepth depth in ClassDepths.ListOfDepths)
{
    MenuItem it = new MenuItem();
    it.Header = depth.name;
    it.Click += new RoutedEventHandler((s, a) => { ChangeDepth(depth); });
    mnuItemDepths.Items.Add(it);
}

ClassDepths.ListOfDepths的每个项目都应该是一个菜单项。 除了一件事之外它有效:

click事件触发ChangeDepth方法,每个菜单项具有相同的参数(深度)。似乎添加的最后一个菜单项定义了由列表创建的每个菜单项的事件处理程序传递给ChangeDepth的深度参数。 有谁知道为什么?菜单项不同,但调用ChangeDepth时每个菜单项的参数相同。

我希望我的解释不是那么糟糕。谢谢!

1 个答案:

答案 0 :(得分:0)

这是在闭包中捕获循环变量'depth'的问题。你可以阅读比here更好的解释。要使此代码按预期工作,只需将循环变量复制到局部变量中,然后传递它:

MenuItem mnuItemDepth = new MenuItem();
foreach (ClassDepth depth in ClassDepths.ListOfDepths)
{
    var tempDepth = depth;  //capture the loop variable here
    MenuItem it = new MenuItem();
    it.Header = depth.name;
    it.Click += new RoutedEventHandler((s, a) => { ChangeDepth(tempDepth); });
    mnuItemDepths.Items.Add(it);
}