Estou iniciando um projeto com o seguinte ambiente técnico: .Net 4.0, Entity Framework 4.0, WPF com arquitetura MVVM
Vi muitos exemplos na rede, alguns livros com esse ambiente. Em alguns dos exemplos, os autores tiveram essa ideia:
- O Viemodel terá uma instância da classe Model (Entity Framework Entity, por exemplo, Person)
- Vincule os controles de exibição do WPF às propriedades do Model
Enquanto alguns autores fizeram:
- O Viemodel irá expor todas as propriedades do modelo.
- Vincule os controles de exibição do WPF às propriedades do ViewModel e não diretamente ao modelo.
Portanto, é uma boa ideia deixar a visualização vincular propriedades do modelo ao invés de exibir o próprio modelo? Ou qual é o mais preferido?
.net
entity-framework
mvvm
Pravin Patil
fonte
fonte
Respostas:
Eu acho que muitos programadores tentam primeiro pegar o atalho de ligação diretamente ao modelo, mas na minha experiência isso tem algumas desvantagens. O principal problema é que, se o modelo da sua entidade for persistido pelo NHibernate ou similar, assim que a Visualização atualizar a propriedade do modelo, o NHibernate poderá persistir com essas alterações no banco de dados. Isso não funciona bem para telas de edição que possuem um botão Salvar / Cancelar. Na verdade, ele pode optar por esperar e persistir tudo como um lote, mas a idéia é que, quando você altera o modelo, está comprometendo sua alteração.
Portanto, você ainda pode se safar da ligação diretamente às propriedades do modelo em telas somente leitura, mas terá uma inconsistência.
Além disso, a maioria dos modelos não é implementada,
INotifyPropertyChanged
portanto, eles podem não ser destinos de ligação adequados se o estado da tela mudar após a exibição inicial.Dada a facilidade das propriedades automáticas, sugiro sempre vincular a View ao ViewModel, não ao Model. É consistente, simples e oferece a maior flexibilidade para suportar mudanças no futuro.
fonte
O ponto de a
ViewModel
é que é um modelo doView
.Você deve ser obrigatório o
ViewModel
àsView
, e não quaisquerModel
propriedades (não diretamente, de qualquer maneira).fonte
Acho os dois métodos aceitáveis
A ligação apenas ao ViewModel é a abordagem "MVVM-purist" e leva a uma melhor separação entre as camadas. A ligação ao modelo geralmente é mais rápida e conveniente.
A menos que eu tenha um bom motivo para separar completamente as camadas (tamanho do projeto, preocupações futuras de manutenção, tipo de modelo com o qual estou trabalhando etc.), vinculo-me ao modelo.
fonte
Eu acho que o que você está vendo é um conceito chamado bind through, ou seja, se o seu modelo tem uma propriedade chamada name e seu view-model expõe essa propriedade sem nenhuma edição ou conversão adicional, é possível vincular o modelo ao que seria.
Pseudo-código:
Isso é feito para reduzir a quantidade de propriedades 'Fluff' no modelo de visualização, infelizmente, também é uma má ideia a longo prazo. O conceito de um modelo de visualização é garantir que a visualização não dependa de uma dependência do modelo. Ao vincular você agora deve garantir que seu modelo contenha uma propriedade chamada name, caso contrário sua implementação será interrompida.
Se você ligar apenas até o modelo de vista, no entanto, poderá alterar o modelo e a visualização nunca saberá, pois apenas verá a propriedade denominada Nome no modelo de visualização.
Agora, isso pode ser atenuado em determinadas circunstâncias, caso seu modelo seja baseado em uma interface. Portanto, se a interface tiver um IBaseDetails que expõe a propriedade ModuleName, você poderá:
Pseudo-código:
Contanto que qualquer um dos modelos que você faça atenda à interface do IBaseDetails, você estará ciente, no entanto, de que este é um caso extremo e, em geral, você é 90% sempre melhor para envolver seu modelo de exibição em todos os modelos que ele cobre.
fonte
Se você estiver vendo muito atrito tentando ir de Model -> ViewModel, tente algo como o AutoMapper. Remove o tédio associado às propriedades de cópia manualmente.
fonte
Eu cheguei aqui só porque tinha a mesma dúvida e me convenci de que sempre ligaria para visualizar o modelo em vez de para o modelo.
Adote a abordagem da forma reativa angular. Você cria um grupo de formulários usando algumas informações no modelo de exibição, mas depois precisa acessar o formulário. Valores para obter os valores e copiar valores no modelo usando qualquer mapeador automático ou manual. Acho que não há coisa mais bonita do que se limitar a propriedades no modelo de visualização, digamos, por exemplo, que eu tenho uma página de visualização do projeto em que tenho o nome do projeto, nome do cliente etc.
Existe um relacionamento entre projeto e cliente, já que um projeto tem um cliente. Portanto, nesse nível, eu não deveria me importar com esse relacionamento. Eu só preciso mostrar visualmente o nome do projeto e o nome do cliente na visualização. Por isso, coloquei duas propriedades no nome do projeto e no nome do cliente do modelo de visualização, para vincular os controles de visualização a ambos. Para eles, mais tarde vou me preocupar em fornecer valores para essas propriedades no código por trás, retirando-o de qualquer estrutura que o modelo tenha.
O mesmo poderia ser feito para atualizar o modelo no caso de salvar / cancelar, não há nada mais limpo.
fonte