MAUI MVVM中如何在方法内正确调用Observable Property类对象
MAUI MVVM中访问Observable Property类元素的问题及解决方法
问题场景
刚接触MAUI和MVVM,尝试在ViewModel方法中访问Observable Property包装的LoginModel类元素时,收到错误提示:不应直接引用带有[ObservableProperty]的字段,应使用生成的属性。
相关代码如下:
登录模型类
public class LoginModel { public string Failmessage { get; set; } = string.Empty; public string Username { get; set; } = string.Empty; public string Password { get; set; } = string.Empty; public bool Validusername { get; set; } = true; public bool Vaildpassword { get; set; } = true; }
错误的ViewModel代码
[ObservableProperty] LoginModel LoginModel public LoginPageViewModel() { LoginModel login= new(); } // 报错的检查方法 if ((string.IsNullOrEmpty(LoginModel.Username)) || (string.IsNullOrWhiteSpace(LoginModel.Username))) { IsBusy = false; LoginModel.Validusername = false; return; }
错误原因
- 命名规范违反:
[ObservableProperty]特性遵循小写开头字段的约定,工具包会自动生成首字母大写的公开属性。你标注的字段是大写开头的LoginModel,导致工具包无法正确生成属性,直接引用时会访问原始字段而非生成的属性。 - 初始化错误:构造函数中你声明了局部变量
login,并未给ObservableProperty对应的字段/生成的属性赋值,后续访问LoginModel.Username会引发空引用异常。
修正方法
步骤1:修正ObservableProperty的字段命名
将标注[ObservableProperty]的字段改为小写开头,工具包会自动生成首字母大写的公开属性LoginModel。
步骤2:正确初始化属性
在构造函数中给生成的公开属性赋值,而非声明局部变量。
步骤3:通过生成的属性访问类元素
在方法中使用自动生成的公开属性LoginModel来访问其内部的Username、Validusername等成员。
修正后的ViewModel代码
using CommunityToolkit.Mvvm.ComponentModel; public partial class LoginPageViewModel : ObservableObject { // 小写开头的字段,自动生成公开属性LoginModel [ObservableProperty] LoginModel loginModel; public LoginPageViewModel() { // 初始化生成的公开属性 LoginModel = new LoginModel(); } public void ValidateLoginInput() { IsBusy = false; // 使用生成的属性访问内部元素 if (string.IsNullOrWhiteSpace(LoginModel.Username)) { LoginModel.Validusername = false; return; } // 其他验证逻辑... } }
补充说明
CommunityToolkit.Mvvm的[ObservableProperty]特性会自动为私有字段生成包含INotifyPropertyChanged实现的公开属性,字段名必须是小写开头(或下划线开头,如_loginModel),生成的属性为对应首字母大写的名称。- 访问时必须使用生成的公开属性,而非原始字段,才能确保MVVM的通知机制正常工作。
内容的提问来源于stack exchange,提问作者ScottNoClue
相关产品推荐
相关产品推荐

