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

Xamarin.Forms ListView多条件搜索异常:初始单条件查询崩溃求助

问题分析与修复方案

嘿,我一眼就看出你这大概率是**空值引用异常(NullReferenceException)**搞的鬼!先给你拆解下为什么会出现这种“先输俩条件再单搜正常,直接单搜就崩”的情况,再给你改好代码:


为啥会崩?

1. 工具数据里有空字段

如果你的Tool模型里,有些工具的ToolDescription或者ToolLocation是null(不是空字符串),那直接调用Contains()方法时,就会触发空引用崩溃。

  • 先输俩条件再单搜时,之前的筛选已经把那些字段为null的工具过滤掉了,所以不会出问题;
  • 初始全量搜索时,数据里混着字段为null的工具,一调用Contains就炸了。

2. 搜索框的Text是Null

有些输入控件(比如你用的SfEntry)在没输入内容时,Text属性可能是null而不是空字符串"",把null传给Contains也会引发异常。


直接能用的修复代码

给可能为null的地方都加上空值保护,同时补全ListView的刷新逻辑(你之前忘了调用EndRefresh(),这也可能引发UI问题):

private void Btn_Search_Clicked(object sender, EventArgs e) {
    var container = BindingContext as ToolViewModel;
    // 把搜索条件转成空字符串,避免null传入Contains
    var searchType = SfEntry_ToolType.Text ?? "";
    var searchLocation = SfEntry_ToolLocation.Text ?? "";
    // 价格字段虽然没用到,也统一处理下好习惯
    var searchPrice = SfEntry_ToolPrice.Text ?? "";

    listTools.BeginRefresh();
    // 给Tool的字段加空值兜底,再调用Contains,还加了不区分大小写的搜索
    listTools.ItemsSource = container.Tools.Where(i => 
        (i.ToolDescription ?? "").Contains(searchType, StringComparison.OrdinalIgnoreCase) 
        && (i.ToolLocation ?? "").Contains(searchLocation, StringComparison.OrdinalIgnoreCase)
    );
    // 必须调用EndRefresh,不然ListView会一直卡在刷新状态
    listTools.EndRefresh();
}

额外的小优化

  • 加StringComparison.OrdinalIgnoreCase让搜索不区分大小写,用户体验更好;
  • 建议把搜索逻辑移到ToolViewModel里,更符合Xamarin.Forms推荐的MVVM架构;
  • 如果工具数据量很大,最好改成异步搜索,避免卡UI。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:05:41