Exemplo # 1: Tenho uma visualização exibida no meu aplicativo MVVM (vamos usar o Silverlight para os fins da discussão) e clico em um botão que deve me levar a uma nova página.
Exemplo 2: Essa mesma visualização possui outro botão que, quando clicado, deve abrir uma visualização de detalhes em uma janela filho (caixa de diálogo).
Sabemos que haverá objetos de comando expostos pelo nosso ViewModel vinculados aos botões com métodos que respondem ao clique do usuário. Mas o que então? Como concluímos a ação? Mesmo se usarmos o chamado NavigationService, o que estamos dizendo?
Para ser mais específico, em um modelo tradicional de exibição primeiro (como esquemas de navegação baseados em URL, como na web ou na estrutura de navegação interna do SL), os objetos de comando precisariam saber qual exibição exibir a seguir. Isso parece ultrapassar os limites quando se trata da separação de preocupações promovidas pelo padrão.
Por outro lado, se o botão não fosse conectado a um objeto Command e se comportasse como um hiperlink, as regras de navegação poderiam ser definidas na marcação. Mas queremos que os modos de exibição controlem o fluxo de aplicativos e a navegação não é apenas outro tipo de lógica de negócios? (Posso dizer sim em alguns casos e não em outros.)
Para mim, a implementação utópica do padrão MVVM (e já ouvi outras pessoas afirmarem isso) seria ter o ViewModel conectado de forma que o aplicativo possa ser executado sem cabeça (ou seja, sem exibições). Isso fornece a maior área de superfície para testes baseados em código e torna o Views uma aparência verdadeira no aplicativo. E meu ViewModel não deve se importar se for exibido na janela principal, em um painel flutuante ou em uma janela filho, deveria?
De acordo com essa abordagem, depende de algum outro mecanismo em tempo de execução "vincular" o que o View deve ser exibido para cada ViewModel. Mas e se quisermos compartilhar uma View com vários ViewModels ou vice-versa?
Portanto, dada a necessidade de gerenciar o relacionamento View-ViewModel para que saibamos o que exibir quando juntamente com a necessidade de navegar entre as visualizações, incluindo a exibição de janelas / caixas de diálogo filho, como podemos realmente fazer isso no padrão MVVM?