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

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;
}

错误原因

  1. 命名规范违反:[ObservableProperty]特性遵循小写开头字段的约定,工具包会自动生成首字母大写的公开属性。你标注的字段是大写开头的LoginModel,导致工具包无法正确生成属性,直接引用时会访问原始字段而非生成的属性。
  2. 初始化错误:构造函数中你声明了局部变量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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 16:26:27