如何使命令CanExecute以false开始



我在我的viewModel中有错误验证,这样当UserName不至少2个字符长时,它将有一个验证错误。

当我的应用程序启动时,这个字段没有被验证,并且被认为没有错误。只有当setter被调用时,它才会检查输入是否有效。在我的形式中,这导致加载时TextBox周围没有红色框。然而,一旦用户输入一个字符,UserName setter就会被调用,它会看到长度小于2个字符,因此会出现验证错误。

这就是它的默认工作方式,这就是我想要的。我不想一开始就打开表单,在TextBox周围有不受欢迎的红框。

现在,在这个表单上,我有一个与iccommand绑定的按钮。当论坛加载时,因为UserName字段在技术上不被认为有任何错误,按钮被启用。但是,当用户输入一个字符时,它将变为禁用状态,如果他删除了所有字符,它将保持禁用状态。

我想我的表单加载没有任何错误,但有按钮被禁用。

现在,我的CanExecute()方法正在检查我的ViewModel中的一个字段,它基本上检查errors列表计数是否大于0。如果是,则有错误,因此返回true。如果不是,则返回false。

我有一个方法来解决我的上述困境,但我不喜欢它。我有这样一张支票。
return UserName.Length < 2 || errors.Count > 0

现在这看起来很好,但如果我有更多的字段被检查,如AddressPort,我必须添加这些以及。所有这一切的真正作用是为CanExeute()提供这个初始的false,它在其他时候都是无用的,因为它是多余的。如果是UserName.Length < 2,当然errors.数组会有一些错误。

这将是很好的,如果创建我的ICommand,在这种情况下是DelegateCommandPrism,我可以初始化它为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对象关联的按钮。

相关内容

  • 没有找到相关文章

最新更新