3

我正在尝试为我的 MVVM 应用程序实现一个高度响应的 UI,所以我选择让所有命令处理程序自动执行,BackgroundWorker这样它们就不会阻塞 UI。

但同时,我不希望用户能够在后台执行相同的命令时执行它。解决方案似乎很明显:

  1. Executed调用处理程序时,让CanExecute处理程序返回false
  2. 启动BackgroundWorker异步
  3. 完成BackgroundWorker后,让CanExecute处理程序true再次返回。

问题是,我需要在第 1 步之后通知 WPF,并在第 3 步之后再次通知 WPF,该步骤CanExecute已更改并且应该是必需的。我知道我可以通过调用来做到这一点CommandManager.InvalidateRequerySuggested,但这会导致CanExecute所有其他命令的处理程序也被重新查询。有很多命令,这不好。

有没有办法要求重新查询特定命令 - 即当前正在执行的命令?

TIA

4

3 回答 3

6

我认为您只需要针对这两种情况引发ICommand.CanExecuteChanged事件,并且相应的控件应该更新其IsEnabled状态。

于 2010-03-23T11:12:54.497 回答
1

gehho 是对的,只需引发 CanExecuteChanged 事件。但老实说,我不知道你的实现,但如果你的 CanExecute 谓词很简单,我认为很难注意到 wpf 正在重新查询。我不敢相信你会注意到性能下降。你测试过性能吗?我的意思是,假设您在 ViewModel 中有 20 个 ICommand(这可能太多了),如果 ICommand.CanExecute 指向一个布尔字段,您根据 backgroundworker 将其设置为 true 和 false,则它应该花费不到纳秒的时间。但是如果 CanExecute 指向一个评估的方法,那么它可能会更长,但我仍然怀疑它是否会引起注意。

但是,嘿,我不知道你的实现。

于 2010-03-25T04:11:32.090 回答
1

使用MVVM Helper 的“DelegatingCommand”,它为命令公开 RaiseCanExecuteChanged()。

因此,您可以订阅 BackgroundWorker 上的 RunWorkercompleted 事件,具体取决于您Command.RaiseCanExecuteChanged()从 ViewModel 调用的记录的工作类型(也许您可以作为结果的一部分返回)。

于 2011-12-12T13:41:09.730 回答