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

.NET MAUI MVVM:无法从XAML视图访问ViewModel可观察属性

问题分析与修复方案

核心问题:QueryProperty 属性参数错误

你的MorePageViewModel中[QueryProperty]的第一个参数写错了,导致导航传递的Forecast对象无法正确绑定到ViewModel的属性上:

错误代码:

[QueryProperty(nameof(TimeSeriesData), "Forecast")]

这里第一个参数应该是ViewModel中接收数据的属性名称(由[ObservableProperty]自动生成的Forecast属性,首字母大写),而不是数据类型TimeSeriesData。

修复步骤

1. 修正QueryProperty参数

将MorePageViewModel的QueryProperty改为:

namespace forecAstIng.ViewModel
{
    [QueryProperty(nameof(Forecast), "Forecast")] // 第一个参数改为nameof(Forecast)
    public partial class MorePageViewModel : BaseViewModel
    {
        public MorePageViewModel()
        {
        }

        [ObservableProperty]
        TimeSeriesData forecast;
    } 
}

2. 确保数据类的访问权限

WeatherData和StockData当前是默认的internal访问级别,虽然当前项目内可以访问,但为了避免潜在的跨组件访问问题,建议显式设置为public:

namespace forecAstIng.Model
{
    public abstract class TimeSeriesData
    {
        // ... 原有代码
    }

    public class WeatherData : TimeSeriesData // 添加public修饰符
    {
    }

    public class StockData : TimeSeriesData // 添加public修饰符
    {
    }
}

3. 验证绑定上下文与路由

确认你的AppShell已经正确注册路由:

// AppShell.xaml.cs
Routing.RegisterRoute(nameof(MorePage), typeof(MorePage));

同时确认MauiProgram.cs中已注册ViewModel的瞬态服务:

builder.Services.AddTransient<MorePageViewModel>();
builder.Services.AddTransient<MorePage>();

原理说明

  • [QueryProperty]的第一个参数是ViewModel中用来接收导航参数的属性名,第二个参数是导航时传递的字典键名(你这里是"Forecast",对应正确)。
  • CommunityToolkit.MVVM的[ObservableProperty]会自动生成Forecast属性(首字母大写)以及对应的PropertyChanged事件,确保绑定的Title能实时更新。

完成以上修改后,MorePage的标题应该能正确显示Forecast.Name的值了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 09:11:20