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

MAUI导航传递Patient对象时出现Null异常,求技术解析

MAUI Shell导航传对象为Null的常见原因与解决要点
  • QueryProperty名称严格匹配
    [QueryProperty]的两个参数必须和导航字典的键、ViewModel属性名完全一致(大小写敏感)。比如导航时字典键是"TargetPatient",ViewModel里的属性定义必须对应:

    // 主页面导航代码
    await Shell.Current.GoToAsync(nameof(EditingPage), new Dictionary<string, object>
    {
        { "TargetPatient", new Patient() }
    });
    
    // EditingViewModel
    [QueryProperty(nameof(CurrentPatient), "TargetPatient")]
    public Patient CurrentPatient { get; set; }
    

    大小写不匹配是最容易忽略的问题,会直接导致属性无法被赋值。

  • 对象序列化要求
    Shell传对象依赖.NET序列化机制,你的Patient类必须满足序列化条件:

    • 必须包含无参数构造函数(序列化器需要创建对象实例)
    • 要传递的属性必须是公共可读写(同时具备get和set访问器)
    • 复杂类型建议标记[DataContract]和[DataMember]特性,避免序列化失败:
      [DataContract]
      public class Patient
      {
          [DataMember]
          public string Name { get; set; }
          [DataMember]
          public int Age { get; set; }
      
          public Patient() { } // 无参构造函数必须存在
      }
      
  • 属性赋值时机与空引用防护
    QueryProperty的赋值是在ViewModel实例化之后、页面显示前完成的。如果你的ShowFields方法在ViewModel构造函数里调用,此时属性还未被赋值,必然触发空引用异常。正确的做法是在属性的setter中触发方法:

    private Patient _currentPatient;
    [QueryProperty(nameof(CurrentPatient), "TargetPatient")]
    public Patient CurrentPatient
    {
        get => _currentPatient;
        set
        {
            _currentPatient = value;
            ShowFields(); // 属性赋值完成后再调用方法
            OnPropertyChanged();
        }
    }
    
  • ViewModel实例一致性
    确保页面绑定的ViewModel是Shell导航时传递参数的实例。如果XAML中通过BindingContext="{local:EditingViewModel}"直接实例化,同时后台代码又重新赋值BindingContext,会导致接收参数的ViewModel和页面实际绑定的不是同一个,最终出现null。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 04:30:58