即使有模态窗口

时间:2018-03-02 04:31:55

标签: wpf icommand canexecute

假设我有一个带按钮的用户控件

<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方法。

1 个答案:

答案 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.
}
}