MVVM Light CanExecute doesn’t work for commands
The following code in MVVM light does not work:
RelayCommand newCommand = new RelayCommand(onExecute, canExecute); . . . canExecute = true; . . . canExecute = false;
That is, the bound command will not update. Even if the changed `canExecute` raises property changed.
Raise it manually
So, the way to fix this is as follows:
public bool canExecute { get { return _canExecute; } set { _canExecute = value; RaisePropertyChanged(); newCommand.RaiseCanExecuteChanged(); } }
Which works fine. However, what if you have 10 commands, and they all have the same dependant property?
Real life
Here’s my method of working around this. Is it effectively a `RaiseAllPropertyChanged()` for commands. Start with a class level list of commands:
// Store a local list of all registered commands to inform of updates private List<RelayCommand> _registeredCommands;
Now create a function that allows us to iterate this and call RaiseCanExecuteChanged to all of them:
private void ReevaluateCommands() { foreach (var eachCommand in _registeredCommands) { eachCommand.RaiseCanExecuteChanged(); } }
Finally, we can simply call this when the dependant property changes:
public bool canExecute { get { return _canExecute; } set { _canExecute = value; RaisePropertyChanged(); ReevaluateCommands(); } }
Magic.
Disclaimer
I kind of stole the idea for this from here. I’m not selling this as a massively scalable, all singing, all dancing solution. It just works for my particular scenario, which is here: