winforms mvvm

MVVM para winforms



(6)

Como dice Brian anteriormente, posiblemente haya dos preguntas aquí:

¿Debería?

Un cliente me pidió que hiciera esto mismo. Usan WPF (y MVVM) para su trabajo en campo nuevo, pero también tienen aplicaciones heredadas de Winforms que a veces necesitan mantenimiento y mejora. Nunca antes habían tenido un escenario donde "Deshazte de la aplicación existente y la reescribas en WPF" era una opción viable.

Para un conjunto particular de mejoras a una aplicación Winform existente (le costé las mejoras a 2 años-hombre, por lo tanto bastante sustancial), estaban bastante interesadas en que adoptara un enfoque que pudiera disminuir el dolor, si quisieran mover la aplicación. a WPF en algún momento en el futuro. Entonces, buscamos escribir un marco de MVVM para Winforms en la creencia de que todo el código en la M y la VM sería reutilizable, venga el día. En el caso de que lográramos casi eso, la VM necesitará ajustes pero no reescritura.

Entonces, hay un escenario del mundo real que describe por qué es posible que desee hacer esto.

¿Podría?

Como han señalado varias personas, el verdadero poder de MVVM es la unión entre V y VM, y esta es realmente la tuerca que debe ser descifrada. Y tener una clase de intermediario específica sentada entre la Vista específica y el Modelo de vista específico no era la respuesta; queríamos algo que, una vez escrito, sería bueno para todos los enlaces de V / VM.

La forma en que lo hicimos fue mirando el archivo Designer del formulario (es decir, la Vista) y para desarrollar un conjunto (3 o 4) de clases de atributos personalizados que definirían la vinculación entre ViewModel y el control. Por ejemplo:

[VmOneWayPropertyBinding("Info", "Text")] private System.Windows.Forms.Label labelInfo;

Este código básicamente definió un enlace unidireccional entre la propiedad Info en ViewModel y la propiedad labelInfo1.Text en el formulario. También terminamos definiendo enlaces bidireccionales y enlaces de comandos, más un par de enlaces esotéricos más (parece recordar que permitimos el enlace a un ErrorProvider, y lo estableceremos automáticamente usando IDataErrorInfo, por ejemplo).

Me apresuro a añadir que estos atributos de enlace se producen fuera de la parte del archivo .Designer que Visual Studio amenaza con destruir cada compilación.

Puede imaginarse que, después de haber escrito estos atributos personalizados relativamente simples, el trabajo real está en el código que se encuentra debajo de este, que en tiempo de ejecución verá todas estas definiciones de enlace estáticas y realizará las operaciones de obtención y configuración correspondientes. Lamentablemente, no puedo publicar el código aquí (ya que es propiedad de mi cliente), pero había clases base tanto para Vistas como para ViewModels y una gran cantidad de reflexión sucediendo bajo el capó.

Sin embargo, con lo que terminamos (después de casi un hombre-mes de esfuerzo en total) había un marco por el cual alguien podía simplemente crear un formulario y un modelo de vista y casar a los dos juntos.

Algunas cosas que abordamos en el camino: ICommand (desafortunadamente Microsoft introdujo esto en un ensamblado específico de WPF, así que tuvimos que definir nuestros propios idénticos), Convertidores (ditto IValueConverter), IDataErrorInfo, INotifyPropertyChanged (ambos afortunadamente definidos en ensamblajes no específicos de WPF) ) Todas estas cosas son realmente útiles si quieres caminar por una ruta MVVM. Ah, y obtener propiedades dentro de contenedores dentro de contenedores dentro de ...

Entonces, el resultado es que ahora tenemos un mecanismo limpio de MVVM para el desarrollo de Winform. Pero no se equivoque, hay un costo definitivo para todo, e incluso con un mes de esfuerzo, no es tan funcional ni tan robusto como WPF. Y nuestros atributos personalizados son un pobre sustituto de xaml.

¿Entonces valió la pena? Bueno, podría decir: "Sí, porque mi cliente me pidió que lo haga y están contentos con el resultado". Pero, en verdad, ha marcado una diferencia positiva, sobre todo porque el código que las personas utilizan es mucho más ordenado. El código está terminando en ViewModels de forma predeterminada, y las vistas son casi sin código.

Posible duplicado:
Patrón de diseño de interfaz de usuario para formularios de Windows (como MVVM para WPF)

¿Se debe usar MVVM para WinForms? Si es así, ¿cuál es la ventaja sobre el uso de MVP?


Creo que hay dos respuestas aquí ... realmente solo una respuesta a "Debería" y una respuesta a "Podría".

En cuanto a "Podría", sin duda es posible. MVVM realmente solo se basa en una vista que puede vincularse a un modelo de vista. Dado que WinForms admite el enlace, esto ciertamente es posible. Es posible que necesite escribir algún código para hacer que ese enlace sea más útil en un mundo MVVM, pero es (al menos) teóricamente posible. Si funcionó bien, los beneficios serían bastante buenos, OMI. Podrías asegurarte de que tu "Vista" de WinForms no tuviera un comportamiento UI, excepto para crear los objetos visuales y vincularlos (en código, no declarativo como en XAML). Los objetos WinForms son muy difíciles de probar, donde ViewModels es muy fácil de probar.

En cuanto a su pregunta real: "Debería", eso se convierte en una decisión mucho más a nivel de proyecto. ¿Cuáles son tus metas? Si está buscando hacer una prueba de lógica de UI bastante compleja, entonces al menos puede examinarla. Afortunadamente, sin embargo, hay otros patrones (Model-View-Presenter, por ejemplo) que tienen más respaldo de la comunidad que también te obliga a escribir una clase de "presentador" comprobable. Encuentro ViewModels significativamente más fácil para escribir pruebas unitarias en comparación con Presenters, pero creo que es una preferencia personal.

Solo como un lado, el patrón MVVM es en su mayoría otro nombre para el patrón "Modelo del presentador". Puede ver si alguien está teniendo éxito con el "Modelo de presentador" contra las IU de WinForms.

¡Buena suerte!


El patrón Model-View-ViewModel (MVVM) es un patrón de diseño. Por definición, un patrón de diseño muestra una solución común en el mundo orientado a objetos y esta solución se puede aplicar en diversas plataformas (WPF, WinForms, Java Swing, etc.). Estoy de acuerdo en que MVVM se usa mejor con WPF porque aprovecha las fuertes capacidades de enlace. Sin embargo, Windows Forms admite el enlace de datos también.

El adaptador WAF Windows Forms muestra cómo aplicar el patrón MVVM en una aplicación de Windows Forms.


MVVM fue creado específicamente para WPF, con el fin de aprovechar las características de WPF como enlaces y comandos. Windows Forms no tiene estas características (*), por lo que no tiene sentido tratar de aplicar el patrón MVVM a una aplicación de Windows Forms ... Probablemente debería usar MVC o MVP.

(*) En realidad tiene un soporte básico para el enlace de datos, pero no tan poderoso como en WPF ...


MVVM se ajusta específicamente al código markup + y al modelo sin apariencia en WPF y Silverlight. No lo recomendaría a una aplicación de winforms ya que creo que sería una exageración. No veo ningún beneficio sobre MVP en una aplicación de winforms. Sin embargo, en WPF y Silverlight siempre es el preferido que MVP.

Lea en la web qué es MVVM y por qué llegó a ser. Eso debería aclararlo más.


No creo que MVVM pueda hacerse en winforms (al menos no sin una gran cantidad de piratería). MVVM separa la vista (su formulario) del modelo de vista (su lógica).

La razón por la que se puede hacer en WPF es porque WPF permite acoplar libremente la vista desde el modelo de vista a través de enlace de datos en xaml. Esto permite que ViewModel no sepa nada sobre la vista y siga pudiendo funcionar. Este es un buen artículo sobre los conceptos básicos de MVVM, creo que aclarará varias preguntas.