CanExecuteChanged
notifies any command sources (like a Button
or MenuItem
) that are bound to that ICommand
that the value returned by CanExecute
has changed. Command sources care about this because they generally need to update their status accordingly (eg. a Button
will disable itself if CanExecute()
returns false
).
- The
CommandManager.RequerySuggested
event is raised whenever the CommandManager
thinks that something has changed that will affect the ability of commands to execute. This might be a change of focus, for example. Turns out that this event fires a lot.
So, in essence, what this bit of code does is ensure that whenever the command manager thinks a command's ability to execute has changed, the command will raise CanExecuteChanged
even if it hasn't actually changed.
I actually dislike this approach to implementing ICommand.CanExecuteChanged
- it feels lazy and isn't entirely reliable. I prefer a much more fine-grained approach where the command exposes a method (eg. RaiseCanExecuteChanged()
) you can call to raise CanExecuteChanged
, then you call this at the appropriate times from your view model.
For example, if you have a command that deletes the currently selected customer, it would have a CanExecute()
handler that returns true
only if there is a customer selected. You would therefore call RaiseCanExecuteChanged
whenever the selected customer changes.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…