Estou tentando aprender o WPF e o problema do MVVM, mas tive um problema. Esta questão é semelhante, mas não é a mesma que esta (manipulação de diálogos no wpf-with-mvvm) ...
Eu tenho um formulário "Login" escrito usando o padrão MVVM.
Este formulário possui um ViewModel que contém o nome de usuário e a senha, que são vinculados à exibição no XAML usando ligações de dados normais. Ele também possui um comando "Login", que é vinculado ao botão "Login" no formulário, usando uma ligação de dados normal.
Quando o comando "Login" é acionado, ele invoca uma função no ViewModel que dispara e envia dados pela rede para efetuar login. Quando essa função é concluída, existem 2 ações:
O login foi inválido - apenas mostramos uma MessageBox e está tudo bem
O login foi válido, precisamos fechar o formulário de Login e retornar como verdadeiro
DialogResult
...
O problema é que o ViewModel não sabe nada sobre a exibição real, então como ele pode fechar a exibição e dizer-lhe para retornar um determinado DialogResult? Eu poderia colocar algum código no CodeBehind e / ou passar o View até o ViewModel, mas parece que isso iria anular completamente todo o ponto do MVVM ...
Atualizar
No final, acabei de violar a "pureza" do padrão MVVM e o View publicou um Closed
evento e expôs um Close
método. O ViewModel então chamaria view.Close
. A visualização é conhecida apenas por meio de uma interface e conectada por meio de um contêiner IOC, de modo que nenhuma testabilidade ou manutenção são perdidas.
Parece bastante tolo que a resposta aceita seja de -5 votos! Embora eu esteja ciente dos bons sentimentos que alguém obtém ao resolver um problema enquanto é "puro", certamente não sou o único que pensa que 200 linhas de eventos, comandos e comportamentos apenas para evitar um método de uma linha. o nome de "padrões" e "pureza" é um pouco ridículo ...
Close
método simples ainda é a melhor solução. Tudo o resto em outros diálogos mais complexos é MVVM e ligação de dados, mas ele só parecia bobo para implementar as enormes "soluções" aqui em vez de apenas um método simples ...