2

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

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。

我希望我的解释没有那么糟糕。谢谢!

4

1 回答 1

1

这是在闭包中捕获循环变量“深度”的问题。您可以阅读比我在这里给出的更好的解释。要使此代码按预期工作,只需将循环变量复制到局部变量中并传递它:

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);
}
于 2012-10-10T15:01:58.300 回答