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

使用Fody实现按钮实时校验时CanLogin方法无法触发如何解决

问题原因与解决方案

出现该问题有两个核心原因:

  • 依赖属性的通知链不完整:如果Users类没有加[AddINotifyPropertyChangedInterface]特性,其内部Email、Password属性修改时不会向外抛出属性变更事件,ViewModel无法感知到这两个值的更新
  • 命令状态未手动刷新:.NET MAUI/Xamarin的Command默认不会自动重新评估CanExecute的返回值,必须手动调用ChangeCanExecute()方法通知UI刷新按钮状态

步骤1:给Users类添加属性变更通知

确保Users类也引用Fody的特性,让内部属性变更可以抛出通知:

[AddINotifyPropertyChangedInterface]
public class Users
{
    public string Email { get; set; }
    public string Password { get; set; }
    // 你的其他业务属性
}

步骤2:监听属性变更,手动刷新命令状态

在ViewModel的构造函数中,监听Users对象的属性变更事件,当邮箱或密码修改时,主动触发Login命令的状态刷新:

[AddINotifyPropertyChangedInterface]
public class LoginPageViewModel {
    public ICommand OpenRegisterPopupCommand { get; set; }
    public ICommand Register { get; set; }
    public ICommand Login { get; set; }
    public Users Users { get; set; }
    public bool IsPopUpOpen { get; set; }

    public LoginPageViewModel() {
        Users = new Users();
        Login = new Command(LoginAction, CanLogin);
        Register = new Command(RegisterAction);
        OpenRegisterPopupCommand = new Command(() => {
            IsPopUpOpen = true;
        });
        // 新增属性变更监听逻辑
        Users.PropertyChanged += (sender, e) =>
        {
            // 只有邮箱、密码变更时才刷新登录按钮状态,减少不必要的性能损耗
            if(e.PropertyName is nameof(Users.Email) or nameof(Users.Password))
            {
                (Login as Command)?.ChangeCanExecute();
            }
        };
    }

    private void LoginAction(object obj) {
        throw new NotImplementedException();
    }

    private bool CanLogin(object arg) {
        return Users != null && !string.IsNullOrEmpty(Users.Email) && !string.IsNullOrEmpty(Users.Password);
    }
}

内容的提问来源于stack exchange,提问作者edu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 07:27:03