假设我有一个带有按钮的用户控件
<UserControl>
<Grid>
<Button x:Name="button" Content="Show Dialog" DataContext="{Binding m_btnShowDialog}" Style="{StaticResource ButtonVM}" Command="{Binding Cmd}" HorizontalAlignment="Left" Margin="29,56,0,0" VerticalAlignment="Top" Width="75" >
</Grid>
</UserControl>
该命令类实现 ICommand 接口。
当焦点在上面的对话框上时,有时会调用 CanExecute。
这是意料之中的。
问题是当我单击按钮时,Execute 方法被调用并弹出一个新的模式对话框。
焦点应该放在新对话框上,但由于某些原因,当我与新对话框交互时,仍然会调用 CanExecute。
这种行为正常吗?
我怎样才能覆盖该行为?
我不希望在显示子模式对话框时调用附加到父对话框控件的命令的 CanExecute 方法。
意料之中的。直接引用WPF专家Josh Smith的话:
WPF 将自动询问 UI 中使用的所有命令 如果他们可以执行。这发生在不同的时间,例如当输入时 焦点转移到另一个控件,在列表中选择项等。 还可以通过调用 CommandManager 的 InvalidateRequery建议的静态方法。这一切 看起来很神奇,梦幻,几乎好得令人难以置信。
您可以在此处获得更详细和清晰的解释
您可以在命令实现中使用 CanExecuteChanged 事件重写行为。
class MyCommand : ICommand
{
public bool CanExecute(object parameter)
{
return maybeTrueOrFalse;
}
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
public void Execute(object parameter)
{
// Do something awesome.
}
}