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