Acho que usar a instrução switch com strings é uma ideia terrível pelos seguintes motivos:
- Seus comandos não podem receber um parâmetro real porque você usou o CommandParameter para identificar o comando em si.
- Seus métodos Execute e CanExecute se tornam grandes blobs, onde é impossível dizer se você está realmente manipulando todos os seus comandos, já que é necessário fazer referência cruzada ao ViewModel com cada arquivo XAML vinculado a ele.
- Alguns comandos não precisam de um CanExecute. Se você tiver cada comando como uma propriedade individual, é muito fácil dizer quais comandos suportam CanExecute e quais não. Com as declarações switch, é muito mais difícil determinar isso.
- É muito difícil substituir o comportamento de um único comando em uma classe derivada. Se você tiver uma classe ViewModel filha, a única maneira de substituir o comportamento de um comando é copiar todo o método Execute (String parameter) e alterar a declaração de um caso em que você está interessado.
- Ferramentas de análise estática não podem dizer a você que sua ligação de comando no XAML está errada porque seu CommandParameter é apenas uma cadeia arbitrária.
Eu acho que as desvantagens da instrução switch com a abordagem de string são tão strongs que eu encorajaria a refatoração de projetos existentes para não fazerem dessa maneira.