You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xamarin.Forms动态按钮点击获取学生ID及操作按钮的实现方法

解决方案

1. 获取当前点击的按钮实例

事件参数里的sender就是触发本次点击的按钮实例,直接强转即可,不需要通过数组索引就能直接操作当前按钮:

private void Btn_Clicked(object sender, EventArgs e)
{
    // 直接拿到当前点击的按钮
    Button clickedBtn = sender as Button;
    if(clickedBtn == null) return;
    // 要禁用按钮直接操作即可
    clickedBtn.IsEnabled = false;
    // 其他逻辑...
}

2. 存储并获取关联的学生ID/Booking数据

Xamarin.Forms没有内置Tag属性,但有更灵活的实现方案,推荐两种常用方式:

方案一:使用BindingContext存储关联数据(最推荐)

所有Xamarin.Forms控件都继承自BindableObject,自带BindingContext属性,专门用来存储绑定相关的自定义数据,直接把对应Booking对象存进去即可:
修改动态生成按钮的代码:

foreach (var item in myList)
{
    string firstname = "Dan Check IN";
    string lastname = "Button";
    var btn = new Button()
    {
        BackgroundColor = Color.Blue,
        TextColor = Color.White,
        Text = firstname + " " + lastname,
        // 把当前Booking对象存在按钮的BindingContext里
        BindingContext = item
    };
    btn.Clicked += Btn_Clicked; 
    checkinButtons.Children.Add(btn);
}

然后在点击事件里读取:

private void Btn_Clicked(object sender, EventArgs e)
{
    Button clickedBtn = sender as Button;
    if(clickedBtn == null) return;
    // 拿到关联的Booking对象
    Booking booking = clickedBtn.BindingContext as Booking;
    if(booking == null) return;
    // 这里就能拿到学生ID、姓名等所有信息了
    var studentId = booking.StudentId; // 替换成你实际的字段名
    // 禁用按钮
    clickedBtn.IsEnabled = false;
    btnGotoExercise.IsVisible = true;
}

方案二:循环内直接用Lambda绑定事件(闭包实现,不需要单独写点击方法)

如果不想单独维护点击事件方法,可以直接在循环里用Lambda绑定,直接访问当前循环的item对象,低版本C#建议加临时变量避免闭包变量捕获问题:

foreach (var item in myList)
{
    // 低版本C#需要加这个临时变量避免闭包异常
    var currentItem = item;
    string firstname = "Dan Check IN";
    string lastname = "Button";
    var btn = new Button()
    {
        BackgroundColor = Color.Blue,
        TextColor = Color.White,
        Text = firstname + " " + lastname,
    };
    // 直接用Lambda写点击逻辑
    btn.Clicked += (s,e) => 
    {
        // 这里直接就能用currentItem,就是当前按钮对应的Booking数据
        var studentId = currentItem.StudentId;
        // 拿到当前按钮也很简单
        Button currentBtn = s as Button;
        currentBtn.IsEnabled = false;
        btnGotoExercise.IsVisible = true;
    };
    checkinButtons.Children.Add(btn);
}

3. 实现类似WinForms的按钮数组功能

如果需要统一管理所有动态生成的按钮,直接在页面类里声明一个全局的List<Button>存储即可,需要获取索引的时候用IndexOf方法:

// 页面类全局变量
private List<Button> _dynamicCheckinButtons = new List<Button>();
// 生成按钮的时候加入列表
foreach (var item in myList)
{
    var btn = new Button(){/* 省略属性配置 */};
    _dynamicCheckinButtons.Add(btn);
    checkinButtons.Children.Add(btn);
}
// 需要找某个按钮的索引时
int index = _dynamicCheckinButtons.IndexOf(clickedBtn);

内容的提问来源于stack exchange,提问作者dotnetdevcsharp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 22:54:03