我试图禁用 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;
我在这里缺少什么?
您的代码仅修改 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();
}
希望有帮助!