假设我有一个带按钮的用户控件
<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方法。
答案 0 :(得分:2)
这是预期的。直接从WPF专家Josh Smith引用:
WPF会自动询问您在UI中使用的所有命令 如果他们可以执行。这发生在不同的时间,例如输入时 焦点转移到另一个控件,在列表中选择一个项目等。 您也可以通过调用来以编程方式触发此操作 CommandManager的InvalidateRequerySuggested静态方法。这一切 似乎是神奇的,梦幻的,而且几乎太好了,不可能成真。
您可以获得更详细,更清晰的解释here
您可以在命令实现中使用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.
}
}