Xamarin Forms如何在ItemTapped选中事件触发后隐藏ListView建议列表
实现方案
你需要新增一个标志位区分搜索框的文本变化是用户主动输入还是点击条目填充导致的,再修改对应事件逻辑即可,具体修改步骤如下:
- 在页面类中添加私有成员字段作为标志位,用来跳过选中条目时的搜索建议列表显示逻辑:
// 页面类成员 private bool _isSelectingPrediction = false;
- 修改
searchResults_ItemTapped方法,选中条目填充文本后隐藏列表,同时设置标志位:
private void searchResults_ItemTapped(object sender, ItemTappedEventArgs e) { try { if (e.Item is Prediction result) { // 标记当前文本变化是选中条目触发,不是用户主动输入 _isSelectingPrediction = true; locationEntry.Text = result.description; // 直接隐藏搜索建议列表 searchResults.IsVisible = false; // 清空选中状态,避免同一条目重复点击无法触发事件 searchResults.SelectedItem = null; } } catch (NullReferenceException nre1) { } catch (Exception ex1) { } }
- 修改
locationText_Changed方法,识别标志位场景,跳过列表显示逻辑:
private async void locationText_Changed(object sender, TextChangedEventArgs e) { try { // 选中条目填充文本的场景,直接重置标志位返回,不显示搜索列表 if (_isSelectingPrediction) { _isSelectingPrediction = false; return; } if (location == null) { await GetLocation(); } string formattedLocation = string.Format("{0}%2C{1}", location.Latitude, location.Longitude); var keyword = e.NewTextValue; if (keyword.Length >= 1) { List<Prediction> predictionList = await VenueLogic1.GetVenues1(keyword, formattedLocation); searchResults.ItemsSource = predictionList; searchResults.IsVisible = true; } else { searchResults.IsVisible = false; } } catch (NullReferenceException nulrex) { } catch (Exception except) { } }
注:加标志位的原因是给SearchBar的Text属性赋值时会自动触发TextChanged事件,此时新文本长度大于1,原有逻辑会重新把列表设为可见,标志位就是用来屏蔽这种场景的列表显示逻辑。
内容的提问来源于stack exchange,提问作者Patrick89
相关产品推荐
相关产品推荐

