Xamarin使用QueryProperty传值时始终获取null值的问题排查
问题原因及解决方法
1. QueryProperty赋值时机错误
你在Page3的构造函数里直接调用了showdisp(),但Shell导航的执行顺序是:先实例化页面(执行构造函数),之后才会通过QueryProperty机制给属性赋值。所以构造函数执行时str还未被赋值,自然返回null。
2. 属性未实现变更通知
str是自动属性,没有实现INotifyPropertyChanged接口。即便后续QueryProperty成功赋值,Label的绑定也无法感知到属性变化,依旧显示旧值(初始的null)。
修改后的接收页面后台代码
using System.ComponentModel; using System.Runtime.CompilerServices; [QueryProperty(nameof(str), nameof(str))] public partial class Page3 : ContentPage, INotifyPropertyChanged { private string _str; public string str { get => _str; set { if (_str != value) { _str = value; OnPropertyChanged(); // 属性赋值完成后再调用弹窗方法 showdisp(); } } } public Page3() { InitializeComponent(); BindingContext = this; // 移除构造函数内的showdisp()调用 } public async void showdisp() { await App.Current.MainPage.DisplayAlert("Hello", str, "OK"); } // 实现INotifyPropertyChanged接口,支持绑定更新 public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } }
补充说明
- 确保
Page3已在Shell路由中注册(比如在AppShell.xaml.cs中添加Routing.RegisterRoute(nameof(Page3), typeof(Page3));),你的导航正常,这一步应该已经完成。 - 传值页面的代码逻辑没有问题,
$"{nameof(Page3)}?str={str}"的写法符合Shell导航传值规范。
内容的提问来源于stack exchange,提问作者KLeo
相关产品推荐
相关产品推荐

