【问题标题】:WPF command not executableWPF 命令不可执行
【发布时间】:2011-04-19 17:15:12
【问题描述】:

我在工具栏上有一个按钮,它的命令设置为“MyControl.Print”(例如)。 在控件中,命令被添加到包括 Execute 和 CanExecute 的命令绑定中。

该控件位于一个窗口中,其他控件已适当停靠。 我发现要启用“打印”按钮,我必须首先“选择”MyControl,这不能提供良好的用户体验,并且确实会导致各种“错误”被提出并引起很多混乱。

有没有一种方法可以确保无论控件是否被“选中”,按钮都处于启用状态?

【问题讨论】:

    标签: wpf binding command


    【解决方案1】:

    由于 CanExecute 没有触发,我认为您可能正在查看 RoutedCommands 的主要缺点 - 它们隧道和冒泡的方式可能会使高度组合的界面无法让命令到达任何有用的地方。出于这个原因,我们最终从(我认为)Microsoft CAG 迁移到了 DelegateCommands。没有任何其他东西,只是命令。效果更好,并且与界面的联系不那么紧密。

    哦,另一个回答提出了一个很好的观点。我假设你的意思是要打印,你的 MyControl 需要有键盘焦点。这只是第一次,然后就可以了吗?

    我推荐http://msdn.microsoft.com/en-us/library/ff921126(PandP.20).aspx 作为一个很好的起点。您不必预先担心 IActiveAware,因为您希望此命令始终可用(或至少让 CanExecute 确定其可用性)。

    【讨论】:

    • CanExecute 在我选择/单击窗口中的控件之前不会触发,然后它会按预期运行
    • 最初收到焦点后,从此正常工作
    • 那么是的,CommandManager.InvalidateRequerySuggested 听起来不错。虽然它有点重,并且不建议(例如)在每次击键时提高:“在某些情况下,CommandManager 不知道会改变命令执行能力的条件变化。在这些情况下,您可以强制CommandManager 通过调用 InvalidateRequerySuggested 方法引发 RequerySuggested 事件,这将反过来导致 RoutedCommand 引发 CanExecuteChanged 事件。" (msdn.microsoft.com/en-us/library/…)
    • 已经关闭了几天...回头看,该按钮仅在选择子控件时才在菜单中启用。您知道使用 DelegateCommands 的任何好的示例吗? - 我只能找到不涵盖我的“儿童控制”场景的简单示例。这真的开始给我带来一些痛苦,所以任何帮助表示赞赏
    • 我最终实现了完美运行的 RelayCommand 方法...感谢stackoverflow.com/questions/650010/…
    【解决方案2】:

    CommandManager.InvalidateRequerySuggested 将强制命令管理器重新调用您的所有 CanExecute 方法,并应禁用该按钮。也许称之为onload?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-02
      • 2019-03-15
      • 1970-01-01
      • 2017-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多