Kiedy nazywa się CanExecute?

W wersji demonstracyjnej mam przycisk do przełączania pola boolisAsking. Tworzę polecenie, które można wykonać tylko wtedy, gdyisAsking==true.

Po naciśnięciu przycisku PrzełączokButton.IsEnable zmienia się natychmiast, co wskazuje, że polecenie znajduje zmianęisAsking.

Czuję się bardzo zdezorientowany, dlaczego obiekt dowodzenia zauważa zmianę pola, kiedyCanExecute będzie wezwany?

Chociaż od pewnego czasu piszę aplikację WPF, jestem nowym użytkownikiem WPF Command. Proszę wyjaśnić tę sprawę i, jeśli to możliwe, wskazać kilka powiązanych artykułów lub blogów (przeczytałem już zbyt wiele artykułów mówiących o poleceniu wycinania / wklejania).

<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>

Kodowanie:

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;
    }
}

questionAnswers(4)

yourAnswerToTheQuestion