.NET MAUI为Shell添加SearchHandler后启动报空引用错误如何解决
问题原因分析
- XAML结构错误:
Shell.SearchHandler是附加属性,直接赋值自定义SearchHandler实例即可,你当前写的嵌套结构相当于重复创建SearchHandler实例,直接触发空引用 - 属性不匹配:你设置了
DisplayMemberName="Name",但测试用的ItemsSource是List<string>类型,string类型没有Name属性,绑定失败会触发空引用 - 初始化时序问题:页面加载阶段
OnQueryChanged会被自动触发一次,此时部分Shell相关上下文还未完成初始化,直接赋值ItemsSource会访问到未初始化的对象
修复方案
第一步:修正XAML代码
移除嵌套的属性配置,把所有参数放到自定义SearchHandler标签上:
<ContentPage ... xmlns:controls="clr-namespace:你自己项目的AnimalSearchHandler所在命名空间"> <Shell.SearchHandler> <controls:AnimalSearchHandler SearchBoxVisibility="Visible" Placeholder="Enter search term" ShowsResults="True" DisplayMemberName="Name"/> </Shell.SearchHandler> <!-- 页面其他内容 --> </ContentPage>
第二步:修正自定义SearchHandler逻辑
先定义匹配DisplayMemberName的Animal类:
public class Animal { public string Name { get; set; } }
调整AnimalSearchHandler的逻辑,增加初始化阶段的空判断:
public class AnimalSearchHandler : SearchHandler { protected override void OnQueryChanged(string oldValue, string newValue) { base.OnQueryChanged(oldValue, newValue); // 初始化阶段查询值为空时不赋值数据源,避免访问未初始化对象 if (string.IsNullOrWhiteSpace(newValue)) { ItemsSource = null; return; } // 数据源使用带Name属性的Animal类型,和DisplayMemberName配置匹配 ItemsSource = new List<Animal>() { new Animal { Name = "Test" }, new Animal { Name = "猫" }, new Animal { Name = "狗" } }.Where(a => a.Name.Contains(newValue, StringComparison.OrdinalIgnoreCase)).ToList(); } protected override void OnItemSelected(object item) { base.OnItemSelected(item); // 此处添加选中搜索结果后的业务逻辑 if (item is Animal selectedAnimal) { // 你的业务代码 } } }
额外注意点
- 如果不需要显示搜索建议,把
ShowsResults设为False,就不需要配置DisplayMemberName,也可以直接用string类型的ItemsSource - 若要全局给Shell加搜索栏,不需要加在单个ContentPage上,直接写在AppShell.xaml的Shell标签里即可
内容的提问来源于stack exchange,提问作者DoubleVoid
相关产品推荐
相关产品推荐

