Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 如果在CanExecute为false时执行命令会怎么样?_Wpf_Silverlight - Fatal编程技术网

Wpf 如果在CanExecute为false时执行命令会怎么样?

Wpf 如果在CanExecute为false时执行命令会怎么样?,wpf,silverlight,Wpf,Silverlight,我有一个有点奇怪的问题,但你的意见对我来说很有趣 让我们想象一下,我们已经在WPF或Silverlight中实现了命令,由于某些原因,Execute方法在不正确的状态下被调用,甚至CanExecute返回false。事情是怎么发生的并不重要,但事实的确如此。当然,我们无法正确执行命令,因为我们的状态不正确,但该怎么办呢 我们是否应该忽视这种情况?但我们可能会错过一些严重的问题 我们应该抛出异常吗?但我们都生活在异步世界中,因此,理论上,可以执行检查,并返回CanExecute的true,然后状态

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

让我们想象一下,我们已经在WPF或Silverlight中实现了命令,由于某些原因,Execute方法在不正确的状态下被调用,甚至CanExecute返回false。事情是怎么发生的并不重要,但事实的确如此。当然,我们无法正确执行命令,因为我们的状态不正确,但该怎么办呢

我们是否应该忽视这种情况?但我们可能会错过一些严重的问题

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


所以,请让我知道你的想法?

你的CanExecute不应该太长太复杂以至于这实际上是个问题

除了在运行Execute时再次检查CanExecute(如果您在CanExecute中没有做坏事,那么这将同步发生),您可以做的就很少了。您的业务规则应该在到达数据存储库的过程中捕获与业务相关的问题,执行过程中调用的任何其他函数也可以自己进行验证和数据检查

如果发生这种情况,那么对我来说,这意味着你在执行过程中遇到了问题。或者可能没有调用CanExecute(可能更改了属性,并且没有重新计算命令)

除非你给出一个关于这种行为不端的代码的可靠例子,否则这就是我能说的最多的了

编辑: 在Execute方法中调用CanExecute不是问题,但如果我们得到false,该怎么办?我们需要离开吗

是的,你可以退出。或者,您可以抛出与验证相关的异常(不建议这样做,因为您通常会通过绑定调用此异常)。基本上,Execute是这个链的开始,任何调用它的人或任何东西都应该被设置为处理错误——你不应该仅仅因为它被调用就期望成功

但是,如果我的同事创建了一个使用我的命令的组件,却忘记在调用Execute之前检查CanExecute,该怎么办

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


请记住:绑定到命令很好,但没有人说命令必须全部在viewmodel中。即使CanExecute也可以调用viewmodel,以便进行数据验证-如果您是一名优秀的编码人员,那么视图所需的viewmodel上的所有方法/属性都将通过一个接口公开。

对不起,不理解您的答案。在Execute方法中调用CanExecute不是问题,但如果我们得到false,该怎么办?我们是否只需要退出?但如果我的同事创建了一个使用我的命令的组件,并且在调用Execute之前忘了检查CanExecute,该怎么办?他希望该命令已成功执行,但事实并非如此。它是c很难找到这个问题。@D.P.我对我的答案作了进一步的解释。