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
相关产品推荐
相关产品推荐

