¿Cuándo se llama CanExecute?

En la demostración, tengo un botón para alternar un campo boolisAsking. Creo un comando que solo puede ejecutarse cuandoisAsking==true.

Una vez que presiono el botón de alternar,okButton.IsEnable cambia inmediatamente, lo que indica que el comando encuentra el cambio deisAsking.

Me siento muy confundido por qué el objeto de comando nota el cambio de un campo, cuandoCanExecute ¿sera llamado?

Aunque escribo la aplicación WPF durante algún tiempo, soy nuevo en el comando WPF. Dé una explicación de este caso y, si es posible, señale algunos artículos o blogs relacionados (ya he leído demasiados artículos que hablan sobre el comando cortar / pegar).

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        x:Class="WpfApplication1.MainWindow"
        Title="MainWindow" Height="350" Width="525" x:Name="mainWindow" >
    <StackPanel>
        <Button Name="okButton" Content="Ok" />
        <Button Content="Toggle"  Click="Button_Click_1"/>
    </StackPanel>
</Window>

Código detrás:

public partial class MainWindow : Window
{
    private bool isAsking;

    public MainWindow()
    {
        InitializeComponent();

        CommandBinding cb = new CommandBinding();
        cb.Command = okCommand;
        cb.CanExecute += CanOKExecute;
        cb.Executed += cb_Executed;
        mainWindow.CommandBindings.Add(cb);
        okButton.Command = okCommand;
    }

    private RoutedCommand okCommand = new RoutedCommand("ok", typeof(MainWindow));


    void cb_Executed(object sender, ExecutedRoutedEventArgs e)
    {

    }

    void CanOKExecute(object sender, CanExecuteRoutedEventArgs e)
    {
        e.CanExecute = isAsking;
    }

    private void Button_Click_1(object sender, RoutedEventArgs e)
    {
        isAsking = !isAsking;
    }
}

Respuestas a la pregunta(4)

Su respuesta a la pregunta