奇怪的问题,除非单击鼠标,否则按钮不会重新启用

2024-04-28

我的应用程序是使用 WPF 中的 MVVM 模式编写的,我的所有按钮都使用命令绑定来执行模型中的代码。所有命令在 CanExecute 中都有代码来确定绑定按钮的启用状态。该逻辑工作完美,但在所有情况下,GUI 都会保持禁用状态,除非我单击 GUI 中的其他位置。

例如,我有一个名为“丢弃糖果”的按钮。当我单击此按钮时,它会在线程池线程中启动一个进程,该进程将名为 Running 的布尔属性设置为true。由于 Discard Candy 命令的 CanExecute 方法看起来像这样

public bool CanExecute(object parameter)
{
  return !Running;
}

一旦进程开始,该按钮将被禁用。问题是,当该过程完成后,“正在运行”被设置为false,但 GUI 不会更新,即放弃糖果不会重新启用。

但是,如果我单击 GUI 中的任意位置(例如窗口或标题栏),“丢弃糖果”按钮会突然启用。所以逻辑是有效的,但发生了一些我不明白的事情。有人可以向我解释一下这种行为吗?

EDIT-- 到目前为止,听起来 CommandManager.InvalidateRequerySuggested 还没有帮助人们。我打算尝试一下,但目前我对此有点警惕。我确实点击了推荐的链接,并决定阅读有关 MVVM 轻型工具包的更多信息。听起来very很好——这里有人使用过它并且能够确认它没有出现我到目前为止所看到的问题吗?虽然我计划在下一个主要版本中尝试 MVVM 轻型工具包。在我的应用程序中,我不想重做当前已到位的所有命令,这就是为什么我可能会从 CommandManager.InvalidateRequerySuggested 开始,这样我们都可以在这里获得有关其有用性的另一个数据点。

EDIT #2-- 非常有趣,MVVM 轻工具包实际上reliesCommandManager.InvalidateRequerySuggested 以支持 UI 禁用/重新启用命令的功能。作者说:

“严格来说,在 WPF 中,如果您的命令绑定到 CommandManager 监视的控件,则您不必自己引发 CanExecuteChanged 事件。您可以让 CommandManager 处理这种情况。也就是说,外部事件可能还要更改 UI 的状态。假设 UI 应从上午 9 点到下午 5 点启用,然后在晚上禁用。用户没有触发 UI,因此代码应该(礼貌地)请求 CommandManager 重新查询状态命令的数量。这是通过调用 CommandManager 上的 InvalidateRequerySuggested 方法来完成的。正如您所猜测的,RelayCommand 类的 RaiseCanExecuteChanged 方法就是执行此操作的。"


除非有理由,否则 WPF 不会更新命令绑定控件。单击 GUI 会导致 WPF 刷新,以便更新生效。

您可以通过调用手动刷新任何命令绑定控件CommandManager.InvalidateRequerySuggested http://msdn.microsoft.com/en-us/library/system.windows.input.commandmanager.invalidaterequerysuggested.aspx.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

奇怪的问题,除非单击鼠标,否则按钮不会重新启用 的相关文章

随机推荐