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
相关产品推荐
相关产品推荐

