对于 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;
}
我在这里做错了什么吗?
我希望能够在方法中访问类的元素。
从你的代码中,我发现你应该使用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;
}
ViewModel 是 ObservableObject,而不是 ObservableProperties。 它们包含 ObservableProperties。
不要手动构建 ViewModel。使用依赖注入并将它们注册为服务。
对于这个所谓的“检查属性值”,实际上是 ObservableObject 中的 ObservableProperties,有 ObservableValidator 类。
https://learn.microsoft.com/en-us/dotnet/communitytoolkit/mvvm/observablevalidator
修复此问题,如有任何问题请询问。
我有另一个适合我的解决方案;据我所知,不需要 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 即可。