Estoy tratando de aprender WPF y el problema MVVM, pero he encontrado un obstáculo. Esta pregunta es similar pero no es exactamente la misma que esta (manejo-diálogos-en-wpf-con-mvvm) ...
Tengo un formulario de "Inicio de sesión" escrito con el patrón MVVM.
Este formulario tiene un ViewModel que contiene el Nombre de usuario y la Contraseña, que están vinculados a la vista en XAML utilizando enlaces de datos normales. También tiene un comando "Iniciar sesión" que está vinculado al botón "Iniciar sesión" en el formulario, de nuevo usando el enlace de datos normal.
Cuando se activa el comando "Iniciar sesión", invoca una función en ViewModel que se apaga y envía datos a través de la red para iniciar sesión. Cuando se completa esta función, hay 2 acciones:
El inicio de sesión no era válido: solo mostramos un MessageBox y todo está bien
El inicio de sesión fue válido, debemos cerrar el formulario de inicio de sesión y hacer que regrese verdadero como su
DialogResult
...
El problema es que ViewModel no sabe nada sobre la vista real, entonces, ¿cómo puede cerrar la vista y decirle que devuelva un DialogResult particular? Podría pegar algo de código en CodeBehind, y / o pasar la vista al ViewModel, pero parece que podría derrotar por completo el punto de MVVM ...
Actualizar
Al final, simplemente violé la "pureza" del patrón MVVM e hice que View publicara un Closed
evento y exponga un Close
método. ViewModel simplemente llamaría view.Close
. La vista solo se conoce a través de una interfaz y se conecta a través de un contenedor IOC, por lo que no se pierde capacidad de prueba ni mantenimiento.
¡Parece bastante tonto que la respuesta aceptada sea de -5 votos! Si bien soy consciente de los buenos sentimientos que uno tiene al resolver un problema mientras es "puro", seguramente no soy el único que piensa que 200 líneas de eventos, comandos y comportamientos solo para evitar un método de una línea en el nombre de "patrones" y "pureza" es un poco ridículo ...
Close
método simple sigue siendo la mejor solución. Todo lo demás en los otros diálogos más complejos es MVVM y databound, pero parecía una tontería implementar las enormes "soluciones" aquí en lugar de solo un método simple ...