c# - 如何动态地向按钮添加不同的命令

标签 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() };
  }
}

最佳答案

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

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

关于c# - 如何动态地向按钮添加不同的命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52831836/

相关文章:

c# - 使用正则表达式忽略空字符串和空格

适用于 Xamarin.forms "Safari cannot open the page because the address is invalid"的 Azure AD B2C?

c# - xamarin 中的 float 菜单栏

xamarin - 如何在CarouselPage中使用IndicatorView?

c# - 不知道类型时如何指定类型化变量

c# - Visual Studio 2010 中的夜间代码指标

visual-studio - 从命令行构建的 Xamarin.Forms android 应用程序不起作用

css - Xamarin.Forms - 像 CSS 一样的嵌套样式继承?

c# - HQL 子查询的意外 NULL 返回

c# - NSubstitute:断言不包含抛出的定义