【问题标题】:Create menu items with click event handler in a loop from a list使用列表中的循环中的单击事件处理程序创建菜单项
【发布时间】:2012-10-10 14:54:01
【问题描述】:

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

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。

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

【问题讨论】:

    标签: c# wpf event-handling menuitem


    【解决方案1】:

    这是在闭包中捕获循环变量“深度”的问题。你可以阅读比我给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);
    }
    

    【讨论】:

      猜你喜欢
      • 2014-07-14
      • 1970-01-01
      • 2015-01-17
      • 1970-01-01
      • 2021-04-25
      • 1970-01-01
      • 2011-11-20
      • 1970-01-01
      • 2018-12-25
      相关资源
      最近更新 更多