评估MVVM命令的“可执行”状态

我正在使用基于下列文章的MVVM模式编写WPF应用程序:使用Model-View-ViewModel设计模式的WPF应用程序

我的View上有两个按钮,按钮的“Command”属性绑定(带有数据绑定)到RelayCommand类的给定实例(参见上面的文章中的“图3 RelayCommand类”)。 RelayCommand类支持检查是否可以执行给定的命令。

WPF会自动禁用其命令无法执行的按钮。

我的每个命令(在ViewModel类中)都会启动后台操作,并且在后台操作完成之前不能再次执行该命令。 RelayCommand实例具有后台操作是否仍在工作或完成的信息。

我的问题如下:在按任意按钮之后,按钮会自动禁用(这是正常的),因为后台操作已启动,并且该命令在执行完成之前无法执行,但操作完成后,按钮不会显示不会自动启用,因为他们的命令的“可执行”谓词不会自动重新评估。 通过让应用程序松动并重新获得焦点(通过按ALT + TAB),可以手动触发重新评估。 做完这个窍门后,这些按钮再次启用。

如何以编程方式重新评估按钮的命令的“可执行”状态?


您可以在CommandManager上调用InvalidateRequerySuggested来通知应该重新查询CanExecute:

CommandManager.InvalidateRequerySuggested();

http://msdn.microsoft.com/en-us/library/system.windows.input.commandmanager.invalidaterequerysuggested.aspx

这取决于特定的ICommand实现是否正确实现了ICommand.CanExecuteChanged模式,因此YMMV。

更新

例如,我使用具有自己的基本实现ICommand:DelegateCommand的Prism。 我发现在Prism的DelegateCommand中为我调用RaiseCanExecuteChanged()。

更新2

并确保您在UI线程上调用InvalidateRequerySuggested()。 如有必要,请使用调度员拨打电话。

链接地址: http://www.djcxy.com/p/9593.html

上一篇: evaluation of MVVM command's "can execute" state

下一篇: Handling Dialogs in WPF with MVVM