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

