Maui Mvvm 与 Observable Property Class Model 配合使用,如何在方法中正确调用类对象

问题描述 投票:0回答:3

对于 maui 和 mvvm 来说仍然很新,我正在尝试找出方法来访问可观察属性类中的元素。例如,我有一个如下所示的登录类:

 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;
  


    }

在我的模型视图中,我将可观察属性 LoginModel 称为 LoginModel

[ObservableProperty]
        LoginModel LoginModel

        public LoginPageViewModel()
        {
           LoginModel login= new();
        }

我想用下面的方法检查属性值,但它总是给我错误。像具有 [ObservableProperty] 的字段不应直接引用,而应使用生成的属性。

 if ((string.IsNullOrEmpty(LoginModel.Username)) || (string.IsNullOrWhiteSpace(LoginModel.Username)))
            {
                IsBusy = false;
                LoginModel.Validusername = false;

                return;
            }

我在这里做错了什么吗?

我希望能够在方法中访问类的元素。

mvvm maui maui-community-toolkit
3个回答
1
投票

从你的代码中,我发现你应该使用nuget CommunityToolkit.Mvvm

问题是你没有正确使用

CommunityToolkit.Mvvm

您可以尝试在类

partial
之前添加前缀
LoginPageViewModel
并以小写字母开头声明
loginmodel
,然后MVVM Toolkit将为您生成
Loginmodel
属性。

您可以参考以下代码:

public  partial class LoginPageViewModel:ObservableObject 
{
    [ObservableProperty]
    LoginModel loginmodel;


    public LoginPageViewModel() {

        //LoginModel login = new();

        Loginmodel = new LoginModel();
    }

    public  void Test() {
        if ((string.IsNullOrEmpty(Loginmodel.Username)) || (string.IsNullOrWhiteSpace(Loginmodel.Username)))
        {
            //IsBusy = false;
            Loginmodel.Validusername = false;

            return;
        }
    }
}

更新

现在 if 语句正在工作,但是当我设置时 Loginmodel.Validusername = false;视图不会随之更新 新价值。

如果你希望 UI 在改变 model

Loginmodel
的值后自动更新,你还需要为类
INotifyPropertyChanged
实现接口
LoginModel

请参考以下代码:

public  class LoginModel: INotifyPropertyChanged 
    {
        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;

        // modify code as follows
        private bool _validusername;
        public bool Validusername
        {
            get => _validusername;
            set
            {
                SetProperty(ref _validusername, value);
            }
        }


        public bool Vaildpassword { get; set; } = true;


        bool SetProperty<T>(ref T storage, T value, [CallerMemberName] string propertyName = null)
        {
            if (Object.Equals(storage, value))
                return false;

            storage = value;
            OnPropertyChanged(propertyName);
            return true;
        }

        protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }

        public event PropertyChangedEventHandler PropertyChanged;
    }

0
投票
  1. ViewModel 是 ObservableObject,而不是 ObservableProperties。 它们包含 ObservableProperties。

  2. 不要手动构建 ViewModel。使用依赖注入并将它们注册为服务。

  3. 对于这个所谓的“检查属性值”,实际上是 ObservableObject 中的 ObservableProperties,有 ObservableValidator 类。

https://learn.microsoft.com/en-us/dotnet/communitytoolkit/mvvm/observablevalidator

修复此问题,如有任何问题请询问。


0
投票

我有另一个适合我的解决方案;据我所知,不需要 INotifyPropertyChanged 接口:

第一部分类似于@Jessie 张的建议:

public  partial class LoginPageViewModel : ObservableObject 
{
    [ObservableProperty]
    LoginModel loginmodel;


    public LoginPageViewModel() {

        //LoginModel login = new();

        Loginmodel = new LoginModel();
    }

    public  void Test() {
        if ((string.IsNullOrEmpty(Loginmodel.Username)) || (string.IsNullOrWhiteSpace(Loginmodel.Username)))
        {
            //IsBusy = false;
            Loginmodel.Validusername = false;

            return;
        }
    }
}

但是,第二部分是:

public partial class LoginModel : ObservableObject
{
    [ObservableProperty]
    public string failmessage;
    [ObservableProperty]
    public string username;
    [ObservableProperty]
    public string password;
    [ObservableProperty]
    public bool validusername;
    [ObservableProperty]
    public bool vaildpassword;
}

您可能不希望所有属性都是可观察的。在这种情况下,您只需删除 ObservableProperty 属性并相应地调整 getter 和 setter 即可。

© www.soinside.com 2019 - 2024. All rights reserved.