Когда вызывается CanExecute?

В демоверсии у меня есть кнопка для переключения поля boolisAsking, Я создаю команду, которая может выполняться только тогда, когдаisAsking==true.

Как только я нажимаю кнопку Toggle,okButton.IsEnable изменяется немедленно, что указывает на то, что команда находит изменениеisAsking.

Я очень смущен, почему объект команды замечает изменение поля, когдаCanExecute будет называться?

Хотя в течение некоторого времени я пишу приложение WPF, я новичок в WPF Command. Пожалуйста, объясните этот случай и, если возможно, укажите несколько связанных статей или блогов (я уже прочитал слишком много статей, в которых говорилось о команде вырезать / вставить).

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

Код-за:

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

Ответы на вопрос(4)

Ваш ответ на вопрос