1

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

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

4

1 回答 1

3

这是意料之中的。直接引用 WPF 专家 Josh Smith 的话:

WPF 将自动询问 UI 中使用的所有命令是否可以执行。这发生在不同的时间,例如当输入焦点转移到另一个控件时,在列表中选择了一个项目等。您还可以通过调用 CommandManager 的 InvalidateRequerySuggested 静态方法以编程方式触发这种情况。这一切似乎很神奇,梦幻,几乎好得令人难以置信。

你可以在这里得到更详细和清晰的解释

您可以在命令实现中使用 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.
}
}
于 2018-03-02T04:59:55.287 回答