Xamarin.Forms ListView项内按钮点击获取对应绑定项方法
问题根因
原有代码失效的核心原因:
- 点击列表项内部嵌套的Delete按钮时,不会触发ListView的项选中行为,因此
MyList.SelectedItem实际取值为null,后续移除项、更新Scan.Text的逻辑无法正常执行。 - 删除项后直接将
Scan.Text赋值为被删除项的Value,和扫码添加时调用SumCost计算总金额的逻辑不匹配,会导致金额显示错误。

修复步骤
- 不需要修改现有XAML布局,首先在后台代码文件顶部引入Linq命名空间,用于总金额求和计算:
using System.Linq;
- 将原有
DeleteButton_Clicked事件代码替换为以下实现:
private void DeleteButton_Clicked(object sender, EventArgs e) { // 触发点击事件的Button就是传入的sender对象 var deleteButton = sender as Button; // DataTemplate内控件的BindingContext就是当前行绑定的ItemID实例 if (deleteButton?.BindingContext is ItemID currentDeleteItem) { // 从Observable集合中移除对应项 Items.Remove(currentDeleteItem); // 重新计算剩余所有项的总金额,和扫码添加时的计算逻辑保持一致 double totalCost = Items.Sum(item => item.Value); Scan.Text = totalCost.ToString(); // 按需清空ListView选中状态 MyList.SelectedItem = null; } }
实现原理
ListView通过DataTemplate生成列表行时,会自动将行内所有控件的BindingContext赋值为当前行绑定的数据源对象,这个取值逻辑不依赖ListView的选中状态:哪怕没有点击选中整行、只是点击行内的按钮,也能准确拿到按钮所属行对应的绑定数据,是Xamarin.Forms列表行内控件获取关联数据最通用的实现方式。
内容的提问来源于stack exchange,提问作者Speberat
相关产品推荐
相关产品推荐

