使用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
相关产品推荐
相关产品推荐

