Xamarin/SQLite/C# 如何通过删除菜单项移除ListView行及SQLite表数据
修复方案
问题根因
- 事件方法未添加
async关键字,await调用无法正常执行,删除操作实际根本没有触发 - 不需要手动实例化新的
LeaveEntry对象,你已经通过MenuItem的BindingContext拿到了对应条目的完整实例,直接用这个实例调用删除方法即可 - 原代码中取
listView.SelectedItem的逻辑多余且未写完,长按弹出菜单时选中项不一定会同步赋值,反而会导致空引用 - 删除数据库数据后未刷新ListView的数据源,界面不会同步更新删除结果
修复后的代码
// 首先给方法添加async关键字,支持await调用 public async void MenuItem_Clicked(object sender, EventArgs e) { LeaveEntry itemToDelete = ((sender as MenuItem).BindingContext as LeaveEntry); // 增加空判断避免空引用异常 if (itemToDelete == null) return; // 直接传入拿到的实例执行删除,SQLite会根据主键ID匹配删除对应条目 await App.Database.DeleteLeaveEntry(itemToDelete); // 重新查询最新的休假列表,刷新ListView显示 var latestLeaveList = await App.Database.GetLeaveEntryAsync(); listView.ItemsSource = latestLeaveList; }
可选优化建议
如果你页面的ListView绑定的是ObservableCollection<LeaveEntry>类型的数据源,删除后直接移除集合中的对应项即可,不需要重新查询整个列表,性能更高:
// 假设你的页面有一个名为LeaveEntries的ObservableCollection<LeaveEntry>类型的绑定数据源 LeaveEntries.Remove(itemToDelete);
内容的提问来源于stack exchange,提问作者aTubOfAdam
相关产品推荐
相关产品推荐

