首页 > 解决方案 > 如何为按钮动态添加不同的命令

问题描述

我想动态地将命令添加到按钮。每个按钮都应该使用迭代器变量作为参数来执行一个函数。问题是,当按钮文本正确显示时,按钮上的“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() };
  }
}

标签: c#xamarin.forms

解决方案


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

当您创建一个 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/


推荐阅读