.NET MAUI中QueryProperty传对象至ViewModel构造函数为空问题
问题解决:MAUI中QueryProperty传递对象时构造函数无法获取值
问题原因
Shell导航的执行流程是:先通过依赖注入实例化BookDetailsViewModel(此时构造函数执行),之后才会将导航参数中的Book对象赋值给ViewModel的Book属性。所以在构造函数中访问this.Book时,该属性还未被赋值,自然为空。而XAML能获取到值是因为后续属性赋值完成后,ObservableProperty会通知UI更新。
解决方案
1. 利用属性变更回调处理赋值逻辑
借助CommunityToolkit.Mvvm的ObservableProperty特性自动生成的属性变更方法,在Book属性被赋值后再设置Title:
修改BookDetailsViewModel.cs:
[QueryProperty(nameof(Book), "Book")] public partial class BookDetailsViewModel : BaseViewModel { [ObservableProperty] Book book; public BookDetailsViewModel() { // 此处不再访问Book属性,避免空引用 } // 当Book属性值发生变化时自动触发该方法 partial void OnBookChanged(Book oldValue, Book newValue) { if (newValue is not null) { Title = newValue.Name; } } }
2. 修正页面构造函数的ViewModel类型错误
DetailsPage的构造函数参数错误地使用了MonkeyDetailsViewModel,需改为对应的BookDetailsViewModel,否则依赖注入会抛出异常:
修改DetailsPage.xaml.cs:
public partial class DetailsPage : ContentPage { public DetailsPage(BookDetailsViewModel viewModel) { InitializeComponent(); BindingContext = viewModel; } protected override void OnNavigatedTo(NavigatedToEventArgs args) { base.OnNavigatedTo(args); } }
补充说明
- 确保
BaseViewModel继承自ObservableObject,否则ObservableProperty特性无法正常工作。 - 导航参数传递逻辑(
BooksViewModel中的GoToDestinationAsync方法)无需修改,当前写法是正确的。
内容的提问来源于stack exchange,提问作者Mertez
相关产品推荐
相关产品推荐

