c# - 如何为按钮动态添加不同的命令
问题描述
我想动态地将命令添加到按钮。每个按钮都应该使用迭代器变量作为参数来执行一个函数。问题是,当按钮文本正确显示时,按钮上的“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/
推荐阅读
- android - 在 IN_APP_ITEMS_ON_VR 中,VR 是什么意思?
- c# - 为 Mac 编译 C++ 代码(Boost Minkowski 方法)
- c++ - 即使使用前向声明 (c++) 也会出现错误“X 不是类型”
- angular - 有循环时移除模板上的调用方法
- python - Dropbox Python API 不更新文件
- angular - 在角度中使用枚举来选择下拉菜单项
- python - 循环遍历包含类的多个字典
- c++ - 如何存储模板类型以供以后分配?
- spring-boot - 将 Spring Boot War 部署到多个 JBoss EAP 7.1 环境的设计
- reporting-services - 按标签按百分比排列 SSRS 矩阵中的列