Xamarin ListView搜索筛选结果无法在视图中显示问题求助
问题分析与解决方案
核心问题1:视图模型未实现INotifyPropertyChanged接口
当前ComidaViewModel没有实现属性变更通知机制,搜索后重新赋值Items时,UI无法感知集合变化,导致ListView无法更新展示结果。
核心问题2:异步代码处理错误
使用Task.Run(...).Wait()会阻塞主线程,既可能造成界面卡顿,也容易引发线程相关异常,正确做法是直接await异步方法。
核心问题3:集合实例化方式不合理
每次搜索都重新创建ObservableCollection<ComidaModel>实例,而非更新原有集合,即使实现通知,这种方式也存在效率问题,且易引发绑定异常。
修改后的视图模型代码
using System.Collections.ObjectModel; using System.ComponentModel; using System.Runtime.CompilerServices; using System.Windows.Input; using Newtonsoft.Json; public class ComidaViewModel : INotifyPropertyChanged { ApiRest apiRest = new ApiRest(); private ObservableCollection<ComidaModel> _items; public ObservableCollection<ComidaModel> Items { get => _items; set { _items = value; OnPropertyChanged(); } } public string categoriaAlimento { get; set; } public ICommand SearchCommand { get; set; } public ComidaViewModel() { // 初始化集合,避免空引用 Items = new ObservableCollection<ComidaModel>(); SearchCommand = new Command(async (text) => { try { // 直接await异步方法,无需Task.Run包裹 var response = await apiRest.ConsultaAlimentos(text.ToString()); var consulta = JsonConvert.DeserializeObject<List<ComidaModel>>(response); // 清空原有集合并添加新数据,保证绑定的集合实例不变 Items.Clear(); foreach (var comida in consulta) { Items.Add(comida); } } catch (Exception ex) { Console.WriteLine(ex); } }); } // 实现INotifyPropertyChanged接口的必要方法 public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } }
额外优化建议
- 搜索前对输入文本做空值判断,避免传入空字符串调用API
- 可添加加载状态提示,提升用户等待体验
- 图片绑定可设置默认占位图,防止图片加载失败时显示空白
内容的提问来源于stack exchange,提问作者Isaac Gamaliel Muñiz
相关产品推荐
相关产品推荐

