Относительно использования RelayCommand и RoutedCommand в MVVM для меня главное отличие заключается в следующем:
Расположение кода
RelayCommand позволяет вам реализовать команду в любом классе (как свойство ICommand с делегатами), который затем традиционно привязывается к элементу управления, который вызывает команду. Этот класс является ViewModel .
Если вы используете маршрутизируемую команду, вам придется реализовать методы, связанные с этой командой, в codebehind элемента управления, потому что методы определяются атрибутами атрибута CommandBinding-element. Предполагается, что строгий MVVM означает наличие «пустого» codebehind-файла, фактически нет возможности использовать стандартные маршрутизируемые команды с MVVM.
То, что сказал Р. Конли, что RelayCommand позволяет вам определять RelayCommand вне ViewModel, верно, но в первую очередь это позволяет вам определить его внутри ViewModel, а RoutedCommand - нет.
Маршрутизация
С другой стороны, RelayCommands не поддерживают маршрутизацию через дерево (как сказано выше), что не является проблемой, если ваш интерфейс основан на одной viewModel. Если это не так, например, если у вас есть коллекция элементов с их собственными viewModel и вы хотите вызвать команду дочернего ViewModel для каждого элемента сразу из родительского элемента, вам придется использовать маршрутизацию (см. Также CompositeCommands) .
В целом, я бы сказал, что стандартные RoutedCommands не могут использоваться в строгом MVVM. Команды RelayCommands идеально подходят для MVVM, но не поддерживают маршрутизацию, которая может вам понадобиться.