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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 04:36:00