NotifyCanExecuteChangedFor 添加到 MAUI 8.0 中的对象时不起作用

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

我试图禁用 XAML 按钮,直到表单有效,在初始加载时它被禁用,但在模型验证过程中未启用。

这是我的代码

public class LoginRequest
{
    public string Email { get; set; }
    public string Password { get; set; }
}
public sealed partial class LoginViewModel : ObservableObject
{
    [ObservableProperty] [NotifyCanExecuteChangedFor(nameof(LoginCommand))]
    private LoginRequest _form;
     
    bool IsFormValid()
    {
        return !string.IsNullOrEmpty(Form.Email) && !string.IsNullOrEmpty(Form.Password);
    }
     
    [RelayCommand(CanExecute = nameof(IsFormValid))]
    async Task Login()
    {
        //...
    }
}
    xmlns:vm="clr-namespace:MyProject.ViewModels.Account"
    x:Class="MyProject.Pages.Account.LoginPage"
    x:TypeArguments="vm:LoginViewModel"
    x:DataType="vm:LoginViewModel">
     
    <Entry Placeholder="Email"
        Text="{x:Binding Form.Email, Mode=TwoWay}">
    </Entry>
     
    <Entry Placeholder="Password"
        Text="{x:Binding Form.Password, Mode=TwoWay}">
    </Entry>
    
    <Button Text="Login" Command="{Binding LoginCommand}">
    </Button>

当我在 ViewModel 中添加单个属性时,它按预期工作,但添加到一个对象中。

[ObservableProperty]
[NotifyCanExecuteChangedFor(nameof(LoginCommand))]
private string email;
    
[ObservableProperty]
[NotifyCanExecuteChangedFor(nameof(LoginCommand))]
private string password;

我在这里缺少什么?

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

您的代码仅修改 Form 实例的属性。

因此,如果您想在对象的属性更改时收到通知,您可以尝试以下方式,

首先,将

Email
Password
设为
ObservableProperty

public partial class LoginRequest :ObservableObject
{
    [ObservableProperty]
    public string email;

    [ObservableProperty]
    public string password;
}

然后在您的视图模型中,注册并实现 Form 实例的 PropertyChanged 事件处理程序。

    public MainPageViewModel()
    {
        Form = new LoginRequest();
        Form.PropertyChanged += Form_PropertyChanged;
    }

    private void Form_PropertyChanged(object? sender, PropertyChangedEventArgs e)
    {
        //this will invoke each time Email or Password change
        loginCommand.NotifyCanExecuteChanged();
    }

希望有帮助!

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