Pergunta

Eu apenas comecei a olhar para M-V-VM para uma aplicação WPF. Tudo faz sentido, até agora, além desta questão específica ...

Eu tenho um ViewModel eu vou chamar Search. Este ViewModel se liga a um DataGrid e listas de resultados de itens. Agora, eu tenho um comando que necessidades para abrir outra visão , as informações do item.

Colocar a lógica para mostrar uma outra visão na busca Visualizar não parece certo, não é testável em tudo.

Aqui está minha implementação ViewModel, que não é testável ...

public class SearchViewModel
{
   public void SelectItem()
   {
     // I want to call the DetailsView from here
     // this seems wrong, and is untestable
     var detailsView = new DetailsView();
     detailsView.Show();
   }
}

Onde é que a lógica para mostrar uma visão de um método go ViewModel nesse padrão?

Foi útil?

Solução

Visualizações nunca deve ser instanciado em qualquer lugar "abaixo" da camada de interface do usuário. VMs existem abaixo daquele reino, portanto, este não é o lugar para colocar essa lógica (como você já percebeu).

Não será quase sempre algum evento nível UI que vai indicar a necessidade de criar a vista. No seu exemplo, pode ser uma linha (duplo) evento clique no datagrid. Isso seria o lugar para nova-up e mostrar sua janela DetailsView.

Outras dicas

Como Kiff observou:

Visualizações nunca deve ser instanciado em qualquer lugar "abaixo" da camada de interface do usuário. VMs existem abaixo daquele reino, portanto, este não é o lugar para colocar essa lógica (como você já percebeu).

Não será quase sempre algum UI evento nível que indicará o precisa criar a vista. Na tua exemplo, pode ser uma linha (duplo) clique evento no datagrid. Este seria o lugar para nova-up e mostrar sua janela DetailsView.

Você tem que perceber que M-V-VM é um pouco diferente do que outros padrões como MVC ou MVP. O ViewModel não tem conhecimento direto da UI. Abrir uma outra vista é uma função específica do ponto de vista. A vista do modelo deve importar menos o que ou quantos pontos de vista estão usando-o de dados. Eu provavelmente nunca iria abrir a vista através de um comando.

alt texto http://blogs.msdn.com//johngossman/attachment/576163.ashx

Aqui está uma regra básica sobre este assunto.

  • Se você está lidando com ações locais em o seu ponto de vista, você pode intiate do vista do modelo.

  • Se é vista cruz (como mostrar um ecrã de pesquisa), em seguida, use um padrão EventAggregator (um serviço de eventos) ou injetar um Application Controller que você invocar métodos, e por sua vez, apresenta a pesquisa.

Catel inclui uma abordagem que envolve o uso de IUIVisualizerService. Esta interface define um controlador de interface que pode ser utilizada para diálogos de exibição em qualquer forma modal ou modaless de um ViewModel. Basicamente, dentro do vm pai, você criar o viewmodel que deve ficar por trás do novo ponto de vista, eo serviço encontra aquele associado (com base em alguma convenção ou registro) e depois mostra-o.

Nós usamos uma variante desse padrão, Aqui temos controladores que representam a VM, de modo que o datacontext da Visão é a VM e os nossos DTOs são propriedades da VM / Controller. Chamamos-lhe um controlador ainda como usamos isso como o ponto de controle e, portanto, lidar com determinado comando do View. Este é (eu acho) onde iríamos implementar o comando como a sua.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top