Estou lendo alguns artigos sobre MVVM, principalmente este e este .
Minha pergunta específica é: Como comunico as alterações do Model do Model para o ViewModel?
No artigo de Josh, não vejo que ele faça isso. O ViewModel sempre pede propriedades ao Model. No exemplo de Rachel, ela tem o modelo implementado INotifyPropertyChanged
e gera eventos do modelo, mas eles são para consumo pela própria visualização (consulte seu artigo / código para obter mais detalhes sobre por que ela faz isso).
Em nenhum lugar vejo exemplos onde o modelo alerta o ViewModel sobre mudanças nas propriedades do modelo. Isso me preocupa, pois talvez não seja feito por algum motivo. Existe um padrão para alertar o ViewModel de mudanças no Model? Pareceria necessário, pois (1) concebivelmente, há mais de 1 ViewModel para cada modelo e (2) mesmo se houver apenas um ViewModel, alguma ação no modelo pode resultar na alteração de outras propriedades.
Suspeito que possa haver respostas / comentários do tipo "Por que você faria isso?" comentários, então aqui está uma descrição do meu programa. Eu sou novo no MVVM, então talvez todo o meu design esteja com defeito. Vou descrevê-lo brevemente.
Estou programando algo que é mais interessante (pelo menos, para mim!) Do que as classes "Cliente" ou "Produto". Estou programando BlackJack.
Eu tenho um modo de exibição que não tem nenhum código por trás e apenas depende da vinculação a propriedades e comandos no ViewModel (consulte o artigo de Josh Smith).
Para o bem ou para o mal, assumi a atitude de que o Modelo deve conter não apenas classes como PlayingCard
, Deck
mas também a BlackJackGame
classe que mantém o estado de todo o jogo e sabe quando o jogador foi à falência, o carteador deve tirar cartas e qual é a pontuação atual do jogador e do dealer (menos de 21, 21, rebentar, etc.).
Desde BlackJackGame
I expor métodos como "drawcard" e ocorreu-me que, quando um cartão é desenhado, propriedades, tais como CardScore
, e IsBust
deve ser atualizado e esses novos valores comunicados ao ViewModel. Talvez seja um pensamento errado?
Pode-se assumir a atitude de que ViewModel chamou o DrawCard()
método, então ele deve saber como pedir uma pontuação atualizada e descobrir se ele está falido ou não. Opiniões?
Em meu ViewModel, tenho a lógica de pegar uma imagem real de uma carta de jogo (com base no naipe, classificação) e torná-la disponível para a visualização. O modelo não deve se preocupar com isso (talvez outro ViewModel usaria apenas números em vez de imagens de cartas). Claro, talvez alguns me digam que o Model nem deveria ter o conceito de um jogo de BlackJack e isso deveria ser tratado no ViewModel?
OnBust
e a VM pode se inscrever nele. Eu acho que você também pode usar uma abordagem IEA também.