绑定命令不更新状态

时间:2015-09-24 13:12:54

标签: c# .net wpf

我现在已经使用Commands很长一段时间了。这是UI到代码交互的一种很好的方式,它完全适合WPF生态系统并使事情变得更容易(如果命令无法执行则自动禁用控件)。

但我越来越意识到命令根本无法正常工作。我不确定我是否使用它们错误但随机某些控件不会更新它们的状态。我必须单击或使用任何UI元素才能进行更新。这甚至让我误认为是开发人员,所以对于任何最终用户来说都是不可取的。它破坏了工作流程。

我正在使用绑定到我的应用程序窗口的默认UIRoutedCommands。我想这里不需要代码 - 就像在每个教程中一样。

我该怎么办这个问题?有更好的选择吗?我听说表达行为更好但是它们很好用,我的意思是它显然不是WPF框架本身的一部分吗?

编辑:根据要求为您提供一些代码。 这是一个元素的CanExecute,它在某个点上没有得到更新。实现(我猜)它应该是。

public void CanExecuteAnalysis(object sender, CanExecuteRoutedEventArgs e)
{
    e.CanExecute = Prefs.Instance.Project?.Assemblies?.Count > 0 &&
                    Prefs.Instance.Context.State == InjectionState.PreAnalyzed;
    e.Handled = true;
}

CommandBinding,添加到我的主窗口的绑定中:

 <CommandBinding Command="{x:Static internal:CommandLibrary.StartAnalysis}" CanExecute="CanExecuteAnalysis" Executed="ExecuteAnalysis" />

订阅它的菜单栏项目:

<MenuItem Header="Start Analysis" Command="{x:Static internal:CommandLibrary.StartAnalysis}">
    <MenuItem.Icon>
         <Image Width="20" Height="20" Source="Data/analyze.png" />
    </MenuItem.Icon>
</MenuItem>

实际上不起作用的是自定义样式菜单(只是带有一些按钮的StackPanel)。那些按钮是我一直在谈论的菜单项。在IsEnabled == false时,他们获得了残疾人风格(灰显)。现在,当我单击该项目时,分析开始,当它完成时,它通常会被禁用,因为InjectionState == InjectionState.Analyzed而不是 PreAnalyzed 。当我点击其他元素时,它首先会被禁用,它本身或做一些其他事情会触发CommandManager调用RequerySuggested

1 个答案:

答案 0 :(得分:0)

在某些情况下命令的CanExecute结果发生了变化,命令无法知道它。看MSDN

  

CommandManager.InvalidateRequerySuggested 方法。

     

CommandManager仅关注确定命令目标何时更改的某些条件,例如键盘焦点的更改。在CommandManager无法充分确定导致命令无法执行的条件更改的情况下,可以调用InvalidateRequerySuggested以强制CommandManager引发RequerySuggested事件。