10

我正在使用 MVVM 模式编写 WPF 应用程序,基于以下文章:具有模型-视图-视图模型设计模式的 WPF 应用程序

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

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

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

我的问题如下:按下任何按钮后,按钮会自动禁用(这没关系),因为后台操作开始并且命令在完成之前无法执行,但是在操作完成后,按钮不会'不会自动启用,因为他们的命令的“可以执行”谓词不会自动重新评估。重新评估可以通过让应用程序松动并重新获得焦点(通过按 ALT+TAB)来手动触发。完成此技巧后,按钮再次启用。

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

4

1 回答 1

20

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

CommandManager.InvalidateRequerySuggested();

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

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

更新

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

更新 2

并确保您在 UI 线程上调用 InvalidateRequerySuggested()。如有必要,请使用 Dispatcher 进行呼叫。

于 2010-06-06T15:59:36.720 回答