如何使ICommand CanExecute以false开头?

时间:2013-01-17 18:52:46

标签: wpf command canexecute

我的viewModel中有错误验证,这样当UserName长度不超过2个字符时,就会出现验证错误。

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

这是默认情况下的工作原理,这就是我想要的。我不想从表格打开开始,并在TextBox周围有不受欢迎的红框。

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

我希望我的表单加载时没有任何错误,但要禁用该按钮。

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

我有办法解决上述困境,但我不喜欢它。我有一张支票。

return UserName.Length < 2 || errors.Count > 0

现在这看起来很好,但是如果我有更多要检查的字段,例如AddressPort,我也必须添加这些字段。所有这些真正有用的是为CanExeute()提供这个初始错误,并且在其他所有时间都没用,因为它将是多余的。如果是UserName.Length < 2,那么errors.数组中会有一些错误。

这很好,如果创建我的ICommand,在这种情况下是来自DelegateCommand的{​​{1}},我可以将其初始化为false,从而禁用。

1 个答案:

答案 0 :(得分:-1)

听起来你应该做的就是在命令启动时强制命令的“CanExecute”,以确保它正在查看最新的“标准”。

由于接口需要通过

声明事件处理程序
public event EventHandler CanExecuteChanged;

我确定你的ICommand处理程序类中有一些东西,比如

public void RaiseCanExecuteChanged()
{
    if (CanExecuteChanged != null)
        CanExecuteChanged(this, new EventArgs());
}

那就是说,在您的视图模型的启动中,您实例化了ICommand对象引用,我只是

yourICommandButton.RaiseCanExecuteChanged();

这将强制检查事件并在字段中的第一次击键之前将其自身刷新为启用。

...澄清 虽然我提到“按钮”,但我知道视图模型中没有实际的“按钮”,而是一个ICommand对象,它通过Execute / CanExecute绑定来处理按钮的动作。

至于刷新“红色”边框,当你只是要求ICommand处理程序“RaiseCanExecuteChanged”时,这不应该发生。如果“CanExecute”函数返回FALSE,则将禁用该用户...

public bool CanUserClickMe()
{
   return UserName.Length > 1 && errors.Count == 0;
}

这实际上并没有针对任何显式字段调用验证测试,只是查看该人已经可以使用的属性。如果用户的名字不是至少两个字符,则它将返回FALSE,从而禁用与ICommand对象相关联的按钮。