我在我的viewModel中有错误验证,这样当UserName
不至少2个字符长时,它将有一个验证错误。
当我的应用程序启动时,这个字段没有被验证,并且被认为没有错误。只有当setter被调用时,它才会检查输入是否有效。在我的形式中,这导致加载时TextBox
周围没有红色框。然而,一旦用户输入一个字符,UserName
setter就会被调用,它会看到长度小于2个字符,因此会出现验证错误。
这就是它的默认工作方式,这就是我想要的。我不想一开始就打开表单,在TextBox
周围有不受欢迎的红框。
现在,在这个表单上,我有一个与iccommand绑定的按钮。当论坛加载时,因为UserName
字段在技术上不被认为有任何错误,按钮被启用。但是,当用户输入一个字符时,它将变为禁用状态,如果他删除了所有字符,它将保持禁用状态。
我想我的表单加载没有任何错误,但有按钮被禁用。
现在,我的CanExecute()
方法正在检查我的ViewModel中的一个字段,它基本上检查errors
列表计数是否大于0。如果是,则有错误,因此返回true。如果不是,则返回false。
return UserName.Length < 2 || errors.Count > 0
现在这看起来很好,但如果我有更多的字段被检查,如Address
和Port
,我必须添加这些以及。所有这一切的真正作用是为CanExeute()
提供这个初始的false,它在其他时候都是无用的,因为它是多余的。如果是UserName.Length < 2
,当然errors.
数组会有一些错误。
这将是很好的,如果创建我的ICommand
,在这种情况下是DelegateCommand
从Prism
,我可以初始化它为false,从而禁用。
听起来你应该做的就是在命令开始时强制执行"CanExecute"以确保它正在查看最近的"标准"
因为接口需要通过
声明事件处理程序public event EventHandler CanExecuteChanged;
我相信你在你的ICommand处理程序类中有一些东西,比如
public void RaiseCanExecuteChanged()
{
if (CanExecuteChanged != null)
CanExecuteChanged(this, new EventArgs());
}
也就是说,在视图模型启动时实例化ICommand对象引用时,我只需要
yourICommandButton.RaiseCanExecuteChanged();
这将强制检查事件,甚至在字段中的第一个击键之前刷新自身是否启用。
澄清……虽然我提到了"按钮",但我知道视图模型中没有实际的"按钮",而是一个ICommand对象,通过Execute/CanExecute绑定处理按钮的动作。
至于刷新"红色"边框,这应该不会发生,当你只是要求iccommand处理程序"RaiseCanExecuteChanged"。如果"CanExecute"函数返回FALSE,它将被用户禁用…
public bool CanUserClickMe()
{
return UserName.Length > 1 && errors.Count == 0;
}
这实际上并不是针对任何显式字段调用验证测试,只是查看这个人已经可以使用的属性。如果用户名不是至少两个字符,它将返回FALSE,从而禁用与ICommand对象关联的按钮。