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

Xamarin.Forms搜索框退格时列表不刷新问题及修复需求

问题分析

你的代码核心问题是每次搜索都直接修改了_viewModel.Items集合,导致删除文字时没有原始完整数据可用于重新筛选——比如输入6位后Items只剩匹配的单条数据,再删到5位时只能在这条数据里筛选,自然出不来结果;清空文本时只设置了IsBusy却没把Items还原成原始数据,所以会清空所有内容。

另外原代码还有个小bug:遍历sorted集合时直接调用Remove,会触发遍历异常,因为集合在遍历过程中被修改了。

修复步骤

1. 在ViewModel中保存原始完整数据

给ViewModel新增一个集合存储所有原始数据,确保筛选时有稳定的数据源:

// 存储全部原始数据的集合
public ObservableCollection<Mower> FullItems { get; set; }
// 绑定UI的筛选后集合
public ObservableCollection<Mower> Items { get; set; }

初始化时把获取到的全量数据同时赋值给两个集合:

// 假设你原本的加载逻辑是获取mowers列表
var mowers = await GetAllMowers();
FullItems = new ObservableCollection<Mower>(mowers);
Items = new ObservableCollection<Mower>(mowers);

2. 修改搜索框TextChanged事件逻辑

所有筛选操作基于FullItems而非当前的Items,同时修正清空文本的处理逻辑:

private void SearchBar_TextChanged(object sender, TextChangedEventArgs e)
{
    var searchBar = (SearchBar)sender;
    noMowersFoundLabel.IsVisible = false;
    var searchText = searchBar.Text?.Trim() ?? string.Empty;

    // 文本为空时,还原为原始完整数据
    if (string.IsNullOrEmpty(searchText))
    {
        _viewModel.Items.Clear();
        foreach (var mower in _viewModel.FullItems)
        {
            _viewModel.Items.Add(mower);
        }
        _viewModel.IsBusy = false;
        return;
    }

    List<Mower> sorted;
    if (searchText.Length < 6)
    {
        // 用LINQ简化筛选逻辑,避免手动遍历移除的异常
        sorted = _viewModel.FullItems
            .Where(m => m.MachineSerialNumber.Contains(searchText))
            .OrderBy(m => m.MachineSerialNumber)
            .ToList();
    }
    else
    {
        // 精确匹配完整序列号
        var matchedItem = _viewModel.FullItems.FirstOrDefault(m => m.MachineSerialNumber == searchText);
        sorted = matchedItem != null ? new List<Mower> { matchedItem } : new List<Mower>();
    }

    // 更新UI绑定的Items集合
    _viewModel.Items.Clear();
    if (sorted.Count > 0)
    {
        foreach (var mower in sorted)
        {
            _viewModel.Items.Add(mower);
        }
    }
    else
    {
        noMowersFoundLabel.IsVisible = true;
    }
}

3. 修复逻辑说明

  • 用FullItems保存原始数据,确保每次删除文字后都能基于全量数据重新筛选
  • 替换手动遍历筛选为LINQ,避免遍历过程中修改集合的异常
  • 清空文本时直接将Items还原为原始数据,保证视图能正确显示全部内容

内容的提问来源于stack exchange,提问作者megsra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 15:10:40