如何在DisplayActionSheet中动态展示Terms列表并传参至编辑页面
问题描述
在ContentPage中使用CollectionView加载Terms类数据,已实现SelectionChanged事件处理可跳转至TermView查看选中Term对应的课程。现需实现编辑Term功能:通过DisplayActionSheet动态展示所有Term(因Term会动态增减,无法手动写死选项),选中后将termId传入EditTerms(termId)。已在SQLite数据库类中实现GetTerms()方法,需完成调用逻辑。
相关现有代码:
private async void termsCollectionView_SelectionChanged(object sender, SelectionChangedEventArgs e) { if(e.CurrentSelection != null) { Terms terms = (Terms)e.CurrentSelection.FirstOrDefault(); await Navigation.PushAsync(new TermView(terms)); } } private async void EditTerm_Clicked(object sender, EventArgs e) { } public static async Task <IEnumerable<Terms>> GetTerms() { await Init(); var terms = await _db.Table<Terms>().ToListAsync(); return terms; }
解决方案
直接在EditTerm_Clicked方法中完成以下逻辑:
- 调用
GetTerms()获取所有Term数据 - 将Term列表转换为
DisplayActionSheet可用的选项文本数组,同时保留每个选项对应的termId - 弹出ActionSheet,根据用户选中的选项匹配对应的
termId,再调用EditTerms(termId)
完整实现代码如下:
private async void EditTerm_Clicked(object sender, EventArgs e) { // 获取所有Term数据 var allTerms = await GetTerms(); if (!allTerms.Any()) { await DisplayAlert("提示", "暂无可用Term", "确定"); return; } // 构建选项列表和对应的termId映射(替换为你实际的属性名) var termOptions = allTerms.Select(t => t.TermName).ToArray(); var termIdMap = allTerms.ToDictionary(t => t.TermName, t => t.TermId); // 显示ActionSheet var selectedTermName = await DisplayActionSheet("选择要编辑的Term", "取消", null, termOptions); // 处理选中结果 if (!string.IsNullOrEmpty(selectedTermName) && selectedTermName != "取消") { if (termIdMap.TryGetValue(selectedTermName, out int termId)) { EditTerms(termId); } } }
关键说明
- 替换代码中的
TermName和TermId为你实际Terms类中对应的属性名称 - 若存在Term名称重复的情况,建议用
$"{term.TermId}-{term.TermName}"作为选项文本,避免映射错误 - 增加空数据判断,避免无Term时弹出空的ActionSheet
内容的提问来源于stack exchange,提问作者Benn_ht
相关产品推荐
相关产品推荐

