如何向按钮动态添加不同的命令

时间:2018-10-16 09:07:12

标签: c# xamarin.forms

我想向按钮动态添加命令。每个按钮都应使用迭代器变量作为参数来执行一个函数。问题是,尽管按钮文本在按钮上正确显示为“ 0、1、2”,但所有命令均以迭代器的最终值“ SomeCommand(2)”执行。如何获得分别执行SomeCommand(0),SomeCommand(1)和SomeCommand(2)的按钮?

public void DynamicButtons()
{
  for(int i = 0; i < 3; i++)
  {
    Button newButton = new Button { Command = new Command(() => { SomeFunction(i); }), Text = i.ToString() };
  }
}

1 个答案:

答案 0 :(得分:3)

您需要创建循环索引的副本并将其传递。

创建lambda时,它将在外部作用域中存储对事物的引用,而不是值本身。因此,随着循环的增加,所有内容都会引用该计数器,因此在执行命令时,所有内容最终都以值“ 2”结尾。

public void DynamicButtons()
{
  for(int i = 0; i < 3; i++)
  {
    var copy = i;

    Button newButton = new Button 
    { 
        Command = new Command(() => 
        { 
            SomeFunction(copy); 
        }), 
        Text = i.ToString() 
    };
  }
}

进一步阅读:https://blogs.msdn.microsoft.com/ericlippert/tag/closures/