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

MVVM es el más comúnmente utilizado con WPF porque es perfectamente adecuado para ello. Pero, ¿qué pasa con Windows Forms? ¿Existe un patrón de enfoque / diseño establecido y comúnmente utilizado como este para Windows Forms también? ¿Uno que funciona explícitamente bien con Windows Forms? ¿Hay algún libro o artículo que describa esto bien? Quizás basado en MVP o MVC?

He probado MVP y parece funcionar muy bien con formularios de Windows también. Este libro tiene un ejemplo de formularios de Windows con patrón MVP (aplicación de nómina de muestra). La aplicación no es tan compleja, pero le dará una idea acerca de cómo crearla.

Principios, patrones y prácticas ágiles en C # …

Puede obtener el código fuente en el código fuente

EDITAR:

Hay dos variaciones del patrón de MVP (a) Vista pasiva y (b) controlador de supervisión

Para escenarios complejos de enlace de datos, prefiero seguir el patrón de controlador Supervisor. Al supervisar el patrón del controlador, la responsabilidad del enlace de datos se basa en la vista. Entonces, para treeview / datagrid esto debería estar en las vistas respectivas, solo la vista de lógica agnóstica debe pasar al presentador.

Recomiendo echar un vistazo al siguiente MVP framework MVC # – Un framework MVP

No sigas por el nombre (es un marco MVP).

Winforms video MVP simples winforms – MVP

Un ejemplo de tratar con la lista desplegable MVP – DropDownList

Ejemplo simple de enlace de treeview (enlace del hombre pobre). Puede agregar cualquier lógica específica de TreeView en BindTree ().

A continuación se muestra el fragmento de código … no probado, directamente ingresado desde el pensamiento …

public interface IYourView { void BindTree(Model model); } public class YourView : System.Windows.Forms, IYourView { private Presenter presenter; public YourView() { presenter = new YourPresenter(this); } public override OnLoad() { presenter.OnLoad(); } public void BindTree(Model model) { // Binding logic goes here.... } } public class YourPresenter { private IYourView view; public YourPresenter(IYourView view) { this.view = view; } public void OnLoad() { // Get data from service.... or whatever soruce Model model = service.GetData(...); view.BindTree(model); } } 

Como ya lo dije, siempre trabajé en un patrón de MVP cuando uso Winforms. Pero el patrón de diseño que utilizará no significa que usará correctamente. Hay montones de antipatrones adheridos a MVP.

Si desea comenzar todo de una buena manera, debe usar el marco para construir un cliente inteligente. Así que recomendaré usar ese diseño y prácticas: Smart Client Software Factory http://www.codeplex.com/smartclient

Aquí tiene una discusión sobre los marcos de cliente inteligente actuales: http://codebetter.com/blogs/glenn.block/archive/2008/05/10/prism-cab-and-winforms-futures.aspx

PD: Me gusta esta publicación en MVP anti-patterns: http://blog.mattwynne.net/2007/06/13/mvp-smells/

Espero que esto ayude

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.

La siguiente entrada presenta una variación de los patrones de diseño MVP / MVVM llamada MVP-VM, que es una solución a medida para aplicaciones de winforms que requieren una cobertura de prueba completa y usan el enlace de datos como mecanismo principal para mantener la presentación actualizada con los datos del modelo.

MVVM para .NET Winforms

MVVM (Model View View Model) introduce un enfoque similar para separar la presentación de los datos en un entorno que habilita el enlace de datos (WPF). Dado que .NET Framework 2.0 ya ofrece una infraestructura de enlace de datos avanzada que también permite el enlace de tiempo de diseño de los objetos de la aplicación, la entidad ‘Ver modelo’ puede encajar bastante bien en el entorno basado en MVP.

Creo que MVP es un patrón muy adecuado para el desarrollo de WinForms (como se evidencia en parte por su uso prominente en CAB, el marco de Microsoft en torno a las aplicaciones WinForms).

Uso MVP, en aplicaciones de WinForms, principalmente para extraer código de la Vista, ya que no puedo / no probaré el código de la Vista. Y también para habilitar el código que necesita ser reutilizado (o duplicado) para permanecer fuera de la Vista donde no se puede compartir fácilmente.

Como evidencia de la efectividad de MVP en WinForms, me referiré a mi propio proyecto. Trabajo en el proyecto ExceptionReporter ( http://www.codeplex.com/ExceptionReporter ) donde necesito reutilizar código entre WPF y la “versión” de WinForms del software. Por lo tanto, utilizo MVP para ambas tecnologías, lo que me permite compartir el mismo Presenter entre ambos ensamblajes. Y evita duplicar ese código.

Usted mencionó que MVVM trabaja para WPF, creo que la razón es debido a un fuerte soporte de enlace de datos. Si no usaba el enlace de datos en WPF (y ciertamente no es obligatorio), entonces podría elegir MVP. El punto es que MVP es una buena opción para cualquier aplicación del lado del cliente. Y posiblemente una opción “mejor”, incluso en WPF, si planea compartir el código entre proyectos que no son WPF.

Para obtener más pruebas del valor de usar MVP en WinForms, consulte la presentación de video de Boodhoo sobre el uso de MVP: http://www.bestechvideos.com/2008/06/29/dnrtv-show-14-jean-paul-boodhoo-on-model -view-presentater Y un artículo de MSDN del mismo autor en http://msdn.microsoft.com/en-us/magazine/cc188690.aspx

Puede usar Enterprise Architecture, Patterns and Practices como punto de partida, aunque están ligeramente anticuados.

En General Guidance hay Arquitectura de aplicaciones para .NET: Diseño de aplicaciones y servicios , que es una buena introducción a las formas .NET y la aplicación en capas N-layer.

texto alternativo http://i.msdn.microsoft.com/ms954595.f00aa01%28en-us%2CMSDN.10%29.gif

Para los “patrones” más formales, existen Patrones de soluciones empresariales que utilizan Microsoft .NET . texto alternativo http://sofes.miximages.com/design-patterns/ms998492.Chp_02OrganizingPatterns_Fig06(en-us,MSDN.10).gif

Para nombrar unos pocos,

  • Modelo-Vista-Controlador
  • Filtro interceptor
  • Aplicación de servicios de tres capas

El método BindTree me parece un poco defectuoso. De repente, la Vista conoce el Modelo. ¿Eso es algo bueno? Debe haber toneladas de personas confrontadas con este tipo de problemas. Me sorprende que no haya ningún libro al respecto. Ya que hay libros sobre todo en el mundo .NET.

Estos diseños no tratan de ocultar el modelo sino que definen con precisión las interacciones entre las diferentes capas de las aplicaciones. Puede cambiar el motor de fondo por completo y siempre que pase un Modelo a través de Bindtree, su IU continuará funcionando.

Ahora el modelo de clase puede ser una mala elección de un nombre en el ejemplo que da Rajesh. Puede ser TreeData o RecordsData. Independientemente de cómo lo defina, tiene lo que necesita para usar el mecanismo de enlace de Winforms para vincular un control específico a los datos subyacentes.

El mejor sitio para buscar este tipo de material está aquí . Martin Fowler ha recostackdo una variedad de patrones de diseño de interfaz de usuario útiles y patrones de diseño empresarial.

De nuevo, la clave de esto es el uso de interfaces para definir con precisión cómo interactúan cada capa.

En mi propia aplicación (una aplicación CAD / CAM utilizada para ejecutar máquinas de corte de metales) mi estructura se ve así.

  • Formularios que implementan interfaces de formulario
  • UIDLL con vistas implementando interfaces de visualización que interactúan con formularios a través de la interfaz de formulario. Las vistas específicas que se registran con UIViewDLL Views ejecutan los objetos de comando que se encuentran en las bibliotecas de comandos que interactúan con el modelo.
  • Bibliotecas de comandos; listas de comandos que implementan ICommand. El comando que interactúa con las vistas lo hace a través de las interfaces expuestas en UIViewDLL.
  • UIViewDLL; expone las interfaces de visualización utilizadas por los comandos.
  • Modelo; las clases y la colección que componen las estructuras de datos centrales de mi aplicación. Para mí, estas son cosas como material, caminos de corte, forma, hojas, antorchas, etc.
  • Utilidad; una DLL que comúnmente utiliza clases de utilidad utilizadas por mi empresa que abarcan diferentes aplicaciones. Por ejemplo, funciones matemáticas complejas.

Hice esta misma pregunta a dos de mis compañeros de techies: ¿es posible MVVM para WindowsForms? Ambos me dieron exactamente la misma respuesta: “¡De ninguna manera! A WindowsForms le faltan los ricos enlaces de WPF y Silverlight (OneTime, OneWay, TwoWay, OnewayToSource) y también le faltan los TypeConverters “.

  • Patrón de activador de pantalla para WindowsForms – puede encontrarlo aquí , portado desde Caliburn.Micro por jagui
  • Rich Bindings y TypeConverters – Truss por Kent Boogaart, lo hace en una interfaz de usuario independiente
  • Comandos: WPF Application Framework (WAF) tiene un proyecto WafWinFormsAdapter que se ocupa de algunas cosas de MVVM, a saber, comandos

Nuevamente, ¿podemos tener MVVM para WinForms? Si podemos. Tenemos todas las piezas. Solo tenemos que unirlos.

La primera buena explicación de los patrones de diseño de la interfaz de usuario que leí fue en el blog de Jeremy Miller: Construyendo su propio CAB . Describe los patrones comunes – Vista pasiva, MVP, etc. y aborda algunas de las formas en que puede implementarlos en C #.

Puede probar MugenMvvmToolkit que permite usar un “MVVM puro” para WinForms. Debido al hecho de que admite enlaces en todas las plataformas, todas las funciones de enlace nativas disponibles para la plataforma WPF están disponibles en todas las plataformas (incluido WinForms).