如果在CanExecute为false时执行了命令怎么办?

时间:2012-09-19 09:10:35

标签: wpf silverlight

我有一个奇怪的问题,但你的意见对我来说很有意思。

让我们假设我们已经在WPF或Silverlight中实现了Command,并且由于某些原因,即使CanExecute返回false,也会在错误状态下调用Execute方法。它是如何发生的并不重要,但确实如此。当然,我们无法正确执行命令,因为我们的状态不正确,但该怎么办?

我们应该忽略这种情况吗?但我们可能会错过一些严重的问题。

我们应该抛出异常吗?但是我们都生活在异步世界中,因此,理论上,检查可以执行为CanExecute返回true,然后状态可能会更改为不正确,Execute将在不正确的状态下调用。所以,我们按要求做了所有事情,但我们有一个例外。

那么,请告诉我你的想法?

1 个答案:

答案 0 :(得分:1)

你的CanExecute不应该那么长而复杂,这实际上是一个问题。

在运行Execute时再次检查CanExecute(如果你没有在CanExecute中做坏事,这将同步发生),那么你就可以做更多的事情了。您的业​​务规则应该在到数据存储库的途中捕获与业务相关的问题,并且由于Execute而调用的任何其他函数也可以进行自己的验证和数据检查。

如果 这种情况发生在我身上,这意味着您在CanExecute的某个地方遇到了问题。或者可能没有调用CanExecute(可能是属性已更改且命令未被重新评估)。

除非你举一个这个行为不端代码的可靠例子,否则这就是我能说的最多。

编辑:

  

在Execute方法中调用CanExecute不是问题,但如果我们错了怎么办?我们需要退出吗?

是的,你可以退出。或者你可以抛出一个与验证相关的异常(不是真的推荐,因为你通常会通过绑定来调用它)。基本上,执行是链的开始,任何人或任何调用它的东西都应该被设置来处理错误 - 你永远不应该仅仅因为它被调用而期望成功。

  

但是如果我的同事创建了一个使用我命令的组件而忘记在调用Execute之前检查CanExecute呢?

在这种情况下,我会说在视图模型中使用命令实现然后绑定到它是不好的。如果该命令是在视图后面的代码中实现的,那么您可以从那里调用到视图模型来执行所需的任何工作(比如保存一些数据),并将该调用包装在try / catch中,如果您捕获例外,您可以在UI中轻松显示某些内容(如果您正确地遵守MVVM,则无法从VM中进行此操作)。

请记住:绑定到命令很棒,但是没有人说这些命令都必须在viewmodel中。甚至CanExecute都可以调用viewmodel以便可以完成数据验证 - 如果你是一个好的编码器,那么视图所需的viewmodel上的所有方法/属性都是通过接口公开的。