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

