MVVM Pattern
MVVM é uma sigla paa Model-View-ViewModel, que é um padrão de design de softwares comum em
aplicações WPF.
O WPF é um framework da Microsoft que possui uma feature de databinding muito poderosa. O uso mais comum desta feature é vincular um determinado Modelo de dados a uma View, mas também é possível fazer o bind de dois componentes WPF.
O padrão MVVM é uma maneira conveniente de fazer o bind entre a View e os dados, assim como o MVC.
Mas se o ASP.NET MVC funciona com um controller que traduz as requisições Get e Post do cliente, como funciona o WPF, em termos de ações do usuário?
Na época do windows forms era muito comum registrar Event Handlers para os controles do Form, delegando a funcionalidade para um código implementado no Code Behind.
Este approach traz algumas desvantagens. Entre elas:
- Você não consegue Mockar a View para testes por causa do acoplamento entre a view e o code behind
- Quase sempre que você altera uma View, você precisa alterar o code behind
- A lógica do code behind não é reaproveitada
Com o MVVM é possível tira toda alógica da camada de apresentação da View através dos Comandos
(outra feature do WPF). Os comandos são suportados pela maioria dos controles e podem ser vinculados a eles assim como fazemos com os dados. Desta maneira movemos toda a lógica de apesentação para o ViewModel.
Este approach traz as seguintes vantagens:
- Testes unitarios no ViewModel
- Alteramos a view sem precisar alterar o ViewModel
- O ViewModel pode ser reutilizado por outras Views
Diferenças entre MVC , MVP e MVVM.
MVC
No padrão MVC temos um Controller que recebe dados inputados pelo usuário. Dependendo do tipo
de input, o controller cria uma nova View, ou modifica o modelo. Ou seja, o modelo e View são criados pelo controller. A view depende do modelo diretamente, e o modelo desconhece todos os outros objetos.
MVP
No padrão MVP (Model-View-presenter) quem recebe o input do usuário é a View que encaminha as informações para o Presenter. O presenter por sua vez, modifica a view ou o modelo, de acordo com o input do usuário. Existe uma dependência bidirecional entre o Presenter e a View (fortemente acoplados) e o modelo desconhece todos os outros objetos. Este padrão é comum em aplicações WPF antigas e aplicações WinForms.
MVVM
Neste padrão a View recebe os dados inputados pelo usuário e encaminha para o ViewModel (usando
commands). A View por sua vez recebe dados do ViewModel por databinding. Neste padrão o modelo
também desconhece os outros objetos e não existe uma dependência biderecional entre a View e o
ViewModel (menos acoplamento).


