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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 05:07:03