You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 07:01:02