Can I use CanExecuteChanged to change the "can execute" condition?
Or else... "for what" its used?
No you can not use it to change the can execute state. It is an event and objects which participate in the ICommand
pattern can choose to listen to this event e.g. a button may use this event to know when to re-query the commands state (by calling the can execute method) to set its enabled state.
In order for the can execute pattern to be useful there needs to be something that can be used to raise the event. Prism's DelegateCommand
has a method you can call to manually raise this event so subscribers will re-query the can execute method if they have opted into the pattern.
Example
In the following Prism based example we change the state of SaveCommand CanExecute
from false to true whilst the save command is executing. The call toRaiseCanExecuteChanged
will cause the CanExecuteChanged
event to be raised, and clients to call the CanExecute
method. In practice this would make a Save button that was bound to SaveCommand
change its state from enabled to disabled and back to enabled again.
public class BlingViewModel
{
private DelegateCommand<object> _saveCommand;
private bool _canSaveExecute = true;
public ICommand SaveCommand
{
get
{
if (_saveCommand == null)
{
_saveCommand = new DelegateCommand<object>
(
executeMethod: _ => Save()
,
canExecuteMethod: _ => _canSaveExecute
);
}
return _saveCommand;
}
}
private void Save()
{
_canSaveExecute = false;
_saveCommand.RaiseCanExecuteChanged();
Console.WriteLine("Saving...");
_canSaveExecute = true;
_saveCommand.RaiseCanExecuteChanged();
}
}