例如,我有一个名为Discard Candy的按钮。当我单击此按钮时,它会在线程池线程中启动一个进程,该进程将一个名为Running的bool属性设置为true。由于Discard Candy命令的CanExecute方法看起来像这样:
public bool CanExecute(object parameter)
{
return !Running;
}
一旦进程开始,按钮就会被禁用。问题在于,当进程完成时,Running被设置为false,但GUI没有更新,即“Discard Candy”未被重新启用。
然而,如果我在GUI的任何地方点击,比如窗口或标题栏,那么“Discard Candy”按钮突然就变成可用状态了。所以逻辑是正确的,但是有些什么事情发生了,我不理解。请有人能解释一下这种行为吗?
编辑 - 到目前为止,看起来CommandManager.InvalidateRequerySuggested对人们没有帮助。我打算试一试,但目前有点担心它。我确实遵循了建议的链接,在这样做的过程中决定更多地了解MVVM light toolkit。它听起来非常不错,有没有人在这里使用过它,并能够确认它没有展现出我迄今为止看到的问题?虽然我计划在我的应用程序的下一个主要版本中尝试MVVM light toolkit,但我不想重做我目前已经放置的所有指令,这就是为什么我可能会先从CommandManager.InvalidateRequerySuggested开始,这样我们就可以得到另一个有关其有用性的数据点。
编辑#2 - 非常有趣,MVVM light toolkit实际上依赖于CommandManager.InvalidateRequerySuggested以支持UI的能力来禁用/重新启用命令。作者说:
"严格来说,在WPF中,如果您的命令绑定到被CommandManager监视的控件,则不需要自己触发CanExecuteChanged事件。您可以让CommandManager处理这种情况。也就是说,外部事件也可能会更改UI的状态。假设UI应该在早上9点到下午5点之间启用,然后在晚上禁用。用户没有触发UI,因此代码应该(礼貌地)请求CommandManager重新查询指令的状态。这是通过在CommandManager上调用InvalidateRequerySuggested方法实现的。而正如你猜到的那样,RelayCommand类的RaiseCanExecuteChanged方法也正是这样做的。"