He estado desarrollando una aplicación LOB muy grande usando mi sabor de M-V-VM al que llamo M-V-MC (Model-View-ModelController), que es una especie de combinación entre M-V-C y M-V-VM. Publiqué this answer sobre cómo se instancian las vistas en M-V-VM a la pregunta "what-are-the-most-common-mistakes-made-in-wpf-development".M-V-VM: algún ejemplo de uso de comandos en ViewModel?
Sam hizo el siguiente comentario con respecto a mi respuesta:
Esto crea un seguimiento-pregunta: ¿Cómo se crea los puntos de vista? Yo uso RelayCommands para vincular acciones de la vista al ViewModel, por lo que la vista ni siquiera sabe que una acción tiene disparado, no sabe que debe abrir una nueva vista . Solución: cree un evento en la máquina virtual de la vista para suscribirse?
Cuando originalmente comenzó el desarrollo M-V-VM tenía esta idea de que todo debe vivir en el modelo de vista, y han estudiado un montón de ejemplos de tipos como Josh Smith y Karl Shifflett. Sin embargo, todavía tengo que encontrar un buen ejemplo de cuándo un comando necesita vivir en ViewModel.
Por ejemplo, supongamos que tengo un ListView que muestra Clientes, y un botón que hago clic para permitirme editar el cliente seleccionado actualmente. ListView (Ver) está vinculado a un clienteVM (ViewModel). Al hacer clic en el botón, se activa EditCustomerCommand, que abre una ventana emergente que me permite editar todas las propiedades de CustomerVM. ¿Dónde vive este EditCustomerCommand? Si se trata de abrir una ventana (funcionalidad UI), ¿no debería definirse en el código subyacente de la vista?
¿Alguien tiene algún ejemplo de cuándo debería definir un comando en la Vista frente al Modelo de Vista?
Matthew Wright estados siguientes:
nuevo y borrar de una lista sería buenos ejemplos. En esos casos, se agrega un registro en blanco o el ViewModel borra el registro actual . Cualquier acción tomada por la vista debe estar en respuesta a esos eventos que ocurren.
Entonces, si hago clic en el botón nuevo, ¿qué ocurre? El Parent ViewModel crea una nueva instancia de CustomerVM y la agrega a su colección ¿no? Entonces, ¿cómo se abriría mi pantalla de edición? La vista debe crear una nueva instancia del Cliente ViewModel y pasarlo al método ParentVM.Add (newlyCreatedVM) ¿verdad?
Digamos que elimino un registro de cliente a través del DeleteCommand que vive en la máquina virtual. la VM llama a la capa empresarial e intenta eliminar el registro. No puede, por lo que devuelve un mensaje a la VM. Quiero mostrar este mensaje en el cuadro de diálogo. ¿Cómo obtiene la vista el mensaje de la acción de comando?
Entonces, si hago clic en el botón nuevo, ¿qué ocurre? La vista debería crear una nueva instancia de ViewModel y pasarla a CurrentVM.Add (newlyCreatedVM), ¿verdad? – Micah
Digamos que elimino un registro de cliente a través de DeleteCommand que vive en la máquina virtual. la VM llama a la capa empresarial e intenta eliminar el registro. No puede, por lo que devuelve un mensaje a la VM. Quiero mostrar este mensaje en el cuadro de diálogo. ¿Cómo obtiene la vista el mensaje de la acción de comando? – Micah