In the demo, I have a button to toggle a bool field isAsking. I create a command which can execute only when isAsking==true.
Once I press the Toggle button, okButton.IsEnable changes immediately, which indicates the command finds the change of isAsking.
I feel very confused why the command object notices the change of a field. When CanExecute will be called?
Although writting WPF application for some time, I’m new to WPF Command. Please give an explanation to this case and if possible, point out some related articles or blogs (I’ve already read too many articles talking about cut/paste 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>
Code-behind:
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;
}
}
I try to search for “the CommandManager detects conditions” and reach this exellent article.
By examining .NET Framework source code, the author finds that the
CommandManagerdoesn’t detect conditions by itself, rather than whenKeyboard.KeyUpEvent,Mouse.MouseUpEvent,Keyboard.GotKeyboardFocusEvent, orKeyboard.LostKeyboardFocusEventoccurs, it will reevaluate CanExecute method.The article includes other information, but the above part has been enough for me.