Estoy revisando algunos artículos MVVM, principalmente este y este .
Mi pregunta específica es: ¿Cómo comunico los cambios de modelo del modelo al modelo de vista?
En el artículo de Josh, no veo que él haga esto. ViewModel siempre solicita propiedades al modelo. En el ejemplo de Rachel, ella tiene el modelo implementado INotifyPropertyChanged
y genera eventos del modelo, pero son para consumo de la vista en sí (vea su artículo / código para más detalles sobre por qué hace esto).
En ninguna parte veo ejemplos en los que el modelo alerta a ViewModel de cambios en las propiedades del modelo. Esto me tiene preocupado de que quizás no se haga por alguna razón. ¿Existe un patrón para alertar a ViewModel de cambios en el modelo? Parecería ser necesario ya que (1) posiblemente hay más de 1 ViewModel para cada modelo, y (2) incluso si solo hay un ViewModel, alguna acción en el modelo podría resultar en el cambio de otras propiedades.
Sospecho que podría haber respuestas / comentarios del tipo "¿Por qué querrías hacer eso?" comentarios, así que aquí hay una descripción de mi programa. Soy nuevo en MVVM, así que quizás todo mi diseño sea defectuoso. Lo describiré brevemente.
Estoy programando algo que es más interesante (¡al menos para mí!) Que las clases de "Cliente" o "Producto". Estoy programando BlackJack.
Tengo una vista que no tiene ningún código detrás y solo se basa en la vinculación a propiedades y comandos en el modelo de vista (consulte el artículo de Josh Smith).
Para bien o para mal, tomé la actitud de que el modelo debería contener no solo clases como PlayingCard
, Deck
sino también la BlackJackGame
clase que mantiene el estado de todo el juego y sabe cuando el jugador se ha arruinado, el crupier tiene que robar cartas y cuál es la puntuación actual del jugador y del crupier (menos de 21, 21, busto, etc.).
De BlackJackGame
expongo métodos como "DrawCard" y se me ocurrió que cuando se saca una tarjeta, las propiedades como CardScore
, y IsBust
deben actualizarse y estos nuevos valores deben comunicarse al ViewModel. ¿Quizás eso es un pensamiento erróneo?
Uno podría adoptar la actitud de que ViewModel llamó al DrawCard()
método, por lo que debería saber pedir una puntuación actualizada y averiguar si está arruinado o no. Opiniones
En mi ViewModel, tengo la lógica para tomar una imagen real de una carta de juego (según el palo, el rango) y ponerla a disposición para la vista. El modelo no debería preocuparse por esto (quizás otro ViewModel solo usaría números en lugar de imágenes de cartas). Por supuesto, ¿quizás algunos me dirán que el Modelo ni siquiera debería tener el concepto de un juego de BlackJack y eso debería manejarse en el ViewModel?
OnBust
y la máquina virtual puede suscribirse a él. Supongo que también podría utilizar un enfoque de la IEA.