问题描述
|
有一天,另一个问题。老实说,如果这一切停止,那会很无聊,不是吗?
编辑:似乎所有的背景信息已过时。这是精简版:
我的Command类使用CommandManagers RequerySuggested事件(如此处所述:WPF自定义ICommand实现和CanExecuteChanged事件)来装配CanExecuteChanged。
public abstract class CommandBase : ICommand
{
public abstract void Execute(object parameter);
public abstract bool CanExecute(object parameter);
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
}
在我的情况下,CommandManager无法建议重新查询在某些情况下会很重要。现在,我必须绕过它,并强制它重新查询。有人知道怎么做这个吗?
另一个编辑:我现在已经尝试了很多事情(更改命令逻辑,删除控件模板和样式),并且仍然陷入困境。不过,我无法在孤立的沙箱场景中重现该问题。我真的认为我在这里遇到了一个bug,因为Button的行为与其外观不一致,即使将Style归结为以下内容:
<Style targettype=\"{x:Type Button}\" x:Key=\"CertificateActionButton\">
<Setter Property=\"Background\" Value=\"{DynamicResource CertificateActionButtonBackground}\"/>
<Setter Property=\"BorderThickness\" Value=\"0\"/>
<Style.Triggers>
<Trigger Property=\"IsEnabled\" Value=\"False\">
<Setter Property=\"Background\" Value=\"LightGray\"/>
</Trigger>
</Style.Triggers>
</Style>
当我取消聚焦然后再次将窗口聚焦时,将恢复连贯性-该按钮看起来仍然处于非活动状态。
更新:由于无法重现此问题,因此我关闭了此问题。
它收到的唯一答案是一个很好的答案,但是在对问题进行了多次编辑之后,q和a似乎不再相关。
解决方法
您可以尝试从此处致电
CommandManager.InvalidateRequerySuggested()
。
CommandManager只关注
在确定的某些条件下
当命令目标已更改时,
例如更改键盘焦点。在
CommandManager的情况
不能充分确定
条件变化导致
命令无法执行,
InvalidateRequerySuggested可以是
调用以强制CommandManager
引发RequerySuggested事件。
同样从注释中:
请注意,如果您是
使用异步调用,然后
CommandManager.InvalidateRequerySuggested()
应该从主线程中调用
因为任何命令监听器都会打开
UI线程。 (使用分派器并调用CheckAccess())