in my WPF UI, I use RoutedCommands that I refer to in my xaml via the following code:
Command=\"viewModel:MessageListViewModel.DeleteMessagesCommand\"
Just implement the CanExecuteChanged
event as follows:
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
When you assign the command to a control, it subscribes to the CanExecuteChanged
event. If you "redirect" it to the CommandManager.RequerySuggested
event, the control will be notified whenever CommandManager.RequerySuggested
is triggered.
I very much prefer the DelegateCommand implementation of Prism for viewmodel binding (http://msdn.microsoft.com/en-us/library/ff654132.aspx). You can invoke CanExecute() on every command invoker by calling RaiseCanExecuteChanged on it.
Simple usage example:
public class ViewModel
{
public ViewModel()
{
Command = new DelegateCommand<object>(x => CommandAction(), x => CanCommandAction());
}
bool state;
public void ChangeState(bool value)
{
state = value;
Command.RaiseCanExecuteChanged();
}
public DelegateCommand<object> Command {get; private set;}
private void CommandAction()
{
//do smthn
}
private bool CanCommandAction() { return true == state; }
}
//and binding as usual
Command="{Binding Command}"