0

我的 viewModel 中有错误验证,因此当它的UserName长度不是至少 2 个字符时,它会出现验证错误。

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

这就是它默认的工作方式,这就是我想要的。我不想从打开表单开始并在TextBox.

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

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

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

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

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

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

很好,如果创建 my ICommand(在本例中是DelegateCommandfrom Prism),我可以将其初始化为 false 并因此禁用。

4

1 回答 1

-1

听起来您应该做的就是在命令开始时强制执行命令的“CanExecute”,以确保它正在查看最新的“标准”。

由于接口需要通过声明事件处理程序

public event EventHandler CanExecuteChanged;

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

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

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

yourICommandButton.RaiseCanExecuteChanged();

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

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

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

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

这实际上并不是针对任何显式字段调用验证测试,只是查看人员已经可以使用的属性。如果用户名不是至少两个字符,它将返回 FALSE 并因此禁用按钮 ASSOCIATED 到 ICommand 对象。

于 2013-01-17T19:06:46.773 回答