Единственное, что я хотел бы добавить к ответу Рича Макгуайра, это то, что RoutedCommands (и их более распространенный потомок RoutedUICommand должны быть связаны с обработчиками событий для корректной работы.
В большинстве реализаций MVVM я сталкивался с попыткой использовать привязку к ViewModel, и, таким образом, ViewModel (а не View) владеет логикой CanExecute / Execute.
Напротив, обработчики событий переносят эту нагрузку на View. Затем обработку можно распространить на ViewModel, но это означает немного более высокую степень связи между ViewModel и View (приведение + вызов метода и т. Д.).