MAUI 8.0中NotifyCanExecuteChangedFor绑定对象时失效问题
你遇到的情况是:将登录表单的Email和Password封装到LoginRequest对象后,按钮的启用状态无法随表单内容变化自动更新;但把这两个属性直接放在ViewModel中时功能正常。
问题根源
问题出在LoginRequest类上:它是一个普通的POCO类,没有实现INotifyPropertyChanged接口。当你通过Entry修改Form.Email或Form.Password时,不会触发任何属性变更通知,ViewModel无法感知到表单内容的变化,也就不会重新执行IsFormValid()来更新LoginCommand的CanExecute状态。
而当你把Email和Password作为ViewModel的单独属性时,[ObservableProperty]特性会自动为这些属性生成实现了INotifyPropertyChanged的代码,属性值变化时会触发通知,进而让命令重新计算启用状态。
解决方法
让LoginRequest继承自CommunityToolkit.Mvvm库中的ObservableObject,并给内部的Email、Password属性添加[ObservableProperty]特性,让它具备属性变更通知能力:
public class LoginRequest : ObservableObject { [ObservableProperty] private string _email; [ObservableProperty] private string _password; }
修改后,当你在Entry中输入内容时,LoginRequest的Email/Password属性变化会触发PropertyChanged事件,ViewModel能感知到这些变化,自动调用IsFormValid()重新验证表单,从而更新LoginCommand的启用状态,按钮就能正常随表单有效性切换状态了。
另外,你ViewModel中_form属性上的[NotifyCanExecuteChangedFor(nameof(LoginCommand))]可以保留,它会在Form对象本身被替换时触发命令状态更新,和内部属性的变更通知互不冲突。
内容的提问来源于stack exchange,提问作者Ramesh

