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

C# 如何向按钮动态添加不同的命令,c#,xamarin.forms,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 Butto

我想动态地向按钮添加命令。每个按钮都应该使用迭代器变量作为参数执行一个函数。问题是,当按钮文本在按钮上正确显示“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() };
  }
}
public void DynamicButtons()
{
对于(int i=0;i<3;i++)
{
按钮newButton=new按钮{Command=new命令(()=>{SomeFunction(i);}),Text=i.ToString();
}
}

您需要创建循环索引的副本并传递该副本

创建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() 
    };
  }
}
public void DynamicButtons()
{
对于(int i=0;i<3;i++)
{
var copy=i;
按钮newButton=新按钮
{ 
命令=新命令(()=>
{ 
复印件;
}), 
Text=i.ToString()
};
}
}
进一步阅读: