是否可以让CommandManager只重新查询特定的WPF命令而不是全部?
我试图为我的MVVM应用程序实现一个高响应的UI,因此我选择让所有命令处理程序在是否可以让CommandManager只重新查询特定的WPF命令而不是全部?,wpf,mvvm,user-interface,routed-commands,Wpf,Mvvm,User Interface,Routed Commands,我试图为我的MVVM应用程序实现一个高响应的UI,因此我选择让所有命令处理程序在BackgroundWorker中自动执行,这样它们就不会阻塞UI 但同时,我不希望用户能够在后台执行相同的命令。解决方案似乎显而易见: 调用执行的处理程序时,让CanExecute处理程序返回false 启动BackgroundWorkerasync 当BackgroundWorker完成时,让CanExecute处理程序再次返回true 问题是,我需要在步骤1之后和步骤3之后再次通知WPF,CanExecute已
BackgroundWorker
中自动执行,这样它们就不会阻塞UI
但同时,我不希望用户能够在后台执行相同的命令。解决方案似乎显而易见:
处理程序时,让CanExecute
处理程序返回false
BackgroundWorker
asyncBackgroundWorker
完成时,让CanExecute
处理程序再次返回true
CanExecute
已更改,并且应该需要它。我知道我可以通过调用CommandManager.InvalidateRequerySuggested
来实现这一点,但这会导致CanExecute
所有其他命令的处理程序也被重新查询。有很多命令,这不好
是否有办法要求重新查询特定命令,即当前正在执行的命令
TIA我认为您只需要针对这两种情况引发事件,相应的控件应该更新其
IsEnabled
状态。gehho是正确的,只需引发CanExecuteChanged事件。但老实说,我不知道您的实现,但如果您的CanExecute谓词很简单,我想很难注意到wpf正在重新查询。我真不敢相信你会注意到演出的热播。您测试过性能吗?我的意思是,假设一个ViewModel中有20个ICommand(这可能太多了),如果ICommand.CanExecute指向一个布尔字段,并且您根据backgroundworker将该字段设置为true和false,则所需时间应少于纳秒。但是如果CanExecute指向一个进行计算的方法,那么它可能会更长,但我仍然怀疑它是否值得注意
但是,嘿,我不知道您的实现。使用'DelegatingCommand',它为命令公开了raisecancecutechanged()
因此,您可以订阅BackgroundWorker上的RunWorkercompleted事件,并根据记录的工作类型(可能您可以作为结果的一部分返回)从ViewModel调用命令。RaiseCanceChanged()