Patrón de diseño de IU para formularios Windows Forms (como MVVM para WPF)

159

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

bitbonk
fuente
ver también stackoverflow.com/questions/654722/…
Ian Ringrose el
55
Esta parece ser una buena pregunta. ver los votos y las estrellas ..
nawfal
13
¿Cómo es que esto no es constructivo cuando es exactamente la conversación que estaba buscando? ¡Moderado, no dictado!
CAD bloke
Básicamente, MVVM para WinForms es posible. Pero la mayoría de las personas preferiría hablar sobre cómo usaron MVP / MVC en el pasado, en lugar de impulsar la idea de Winforms / MVVM. O prefieren considerar cómo se llama realmente Presenter Model, no MVVM, y cuán dulce es MVVM para WPF.
H. Abraham Chavez
9
Siempre me decepciona cuando este tipo de pregunta se cierra como "no constructiva" ya que, como otro cartel ya mencionó, este tipo de discusión es exactamente lo que vine a buscar. Moderadores, por favor, tengan una visión más liberal y disminuyan el botón "no constructivo".
Tim Long

Respuestas:

94

He intentado MVP y parece funcionar muy bien con los 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 sobre cómo crearla.

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

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

EDITAR:

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

Para escenarios de enlace de datos complejos, prefiero ir con el patrón del controlador de supervisión. Al supervisar el patrón del controlador, la responsabilidad de vinculación de datos recae en la vista. Por lo tanto, para treeview / datagrid, esto debería estar en las vistas respectivas, solo la lógica agnóstica de la vista debería pasar al presentador.

Recomendaré echar un vistazo al siguiente marco MVP MVC #: un marco MVP

No use el nombre (es un marco MVP).

Winforms simple MVP video Winforms - MVP

Un ejemplo de cómo lidiar con la lista desplegable MVP - DropDownList

Ejemplo simple de enlace de vista de árbol (enlace de pobre). Puede agregar cualquier lógica específica de vista de árbol en BindTree ().

A continuación se muestra el fragmento de código ... no probado, directamente tecleado 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);
   }
}
rajesh pillai
fuente
1
Gracias, el ejemplo en ese libro es demasiado simple para mi gusto. ¿Cómo procedería en Winforms y MVP con una visualización de datos más compleja como TreeView o DataGridView cuánta lógica (qué) residiría dónde?
bitbonk
bitbonk: he actualizado la respuesta y verifico si puedo obtener más información.
rajesh pillai
1
El método BindTree me parece un poco defectuoso. De repente, la Vista conoce al Modelo. ¿Eso es algo bueno? Debe haber toneladas de gente confrontada 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.
bitbonk
1
Eso no es un defecto. Este es el sabor del "Controlador supervisor" del patrón MVP. En el Controlador supervisor, la vista conoce el modelo (este es un modelo de presentación). La otra es "Vista pasiva", donde la vista está totalmente desacoplada del modelo.
rajesh pillai
14

Como ya se dijo, siempre trabajé en un patrón MVP cuando utilicé Winforms. Pero el patrón de diseño que usará no significa que usará correctamente. Hay un montón de antipatrón adjunto a MVP.

Si desea comenzar todo de una buena manera, debe usar el marco para crear un cliente inteligente. Por lo tanto, 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 actuales de clientes inteligentes: http://codebetter.com/blogs/glenn.block/archive/2008/05/10/prism-cab-and-winforms-futures.aspx

PD: Me gusta esta publicación sobre los antipatrones de MVP: http://blog.mattwynne.net/2007/06/13/mvp-smells/

Espero que esto ayude

alexl
fuente
9

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 varias 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 también admite el enlace de datos.

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

jbe
fuente
3
El WAF es para WPF, no para Windows Forms. El enlace es engañoso.
Bentley Davis
2
El enlace no es engañoso. WAF Windows Forms Adapter viene con una aplicación MVVM que se implementa dos veces: 1. WinForms; 2. WPF. Ambas aplicaciones comparten las capas inferiores que son independientes de la tecnología UI.
jbe
5

He escrito sobre una variación de los patrones de diseño MVP / MVVM llamada MVP-VM, que es una solución a medida para aplicaciones winforms que requieren una cobertura de prueba completa y utilizan 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) presenta un enfoque similar para separar la presentación de los datos en un entorno que permite el enlace de datos (WPF). Dado que .NET Framework 2.0 ya ofrece una infraestructura avanzada de enlace de datos 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 un entorno basado en MVP.

Aviad Ezra
fuente
4

Le hice esta misma pregunta a dos de mis compañeros técnicos: ¿es posible MVVM para WindowsForms? Ambos me dieron exactamente la misma respuesta: "¡De ninguna manera! A WindowsForms le faltan los enlaces ricos 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 Rindings y TypeConverters - Truss de Kent Boogaart, lo hace de forma independiente de la interfaz de usuario
  • Comandos: WPF Application Framework (WAF) tiene un proyecto WafWinFormsAdapter que se ocupa de algunas cosas MVVM, a saber, comandos

De nuevo, ¿podemos tener MVVM para WinForms? Si podemos. Tenemos todas las piezas Solo tenemos que pegarlos.

Tiago Freitas Leal
fuente
4

Creo que MVP es un patrón muy adecuado para el desarrollo de WinForms, como lo demuestra en parte su uso en CAB , el marco de Microsoft para WinForms.

Uso MVP en WinForms para extraer el código de la Vista, porque no puedo probar el código de la Vista. Y también para habilitar el código que necesita ser reutilizado (o duplicado) para mantenerse fuera de la Vista donde no se puede compartir.

Puedo referirme a mi propio proyecto donde uso el patrón MVP ExceptionReporter.NET . Aunque estoy seguro de que no lo uso perfectamente.

Usted mencionó que MVVM trabaja para WPF. Creo que la razón de esto es debido al fuerte soporte de enlace de datos. Si no estaba utilizando el enlace de datos en WPF (y ciertamente no es obligatorio), 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 código entre proyectos que no son WPF.

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

PandaWood
fuente
Las cosas de Boodhoo parecen ser sobre WebForms, no sobre WinForms. ¿A menos que haya más cosas más adelante en el video ...?
Roger Lipscombe
3

El método BindTree me parece un poco defectuoso. De repente, la Vista conoce al Modelo. ¿Eso es algo bueno? Debe haber toneladas de gente confrontada 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 backend por completo y siempre que pase un modelo a través de Bindtree, su interfaz de usuario seguirá 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. Como sea que 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 recopilado una variedad de patrones de diseño de interfaz de usuario útiles y patrones de diseño empresarial.

Nuevamente, la clave para esto es el uso de interfaces para definir con precisión cómo cada capa interactúa entre sí.

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

  • Formularios que implementan interfaces de formulario
  • UIDLL con vistas que implementan interfaces de vista que interactúan con formularios a través de la interfaz de formulario. Las vistas específicas se registran con UIViewDLL Views ejecuta objetos de comando que se encuentran en 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 vista utilizadas por los comandos.
  • Modelo; las clases y la colección que conforman las estructuras de datos centrales de mi aplicación. Para mí, estas son cosas como material, caminos de corte, formas, láminas, antorchas, etc.
  • Utilidad; una DLL que ha utilizado comúnmente clases de utilidad utilizadas por mi empresa que abarcan diferentes aplicaciones. Por ejemplo, funciones matemáticas complejas.
RS Conley
fuente
3

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

Bajo la Guía general, se encuentra la Arquitectura de aplicación para .NET: Diseño de aplicaciones y servicios , que es una buena introducción a las formas .NET y la aplicación en capas de N niveles.

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

Para "patrones" más formales, hay patrones de soluciones empresariales que usan Microsoft .NET . (fuente: microsoft.com )texto alternativo

Para nombrar unos pocos,

Eugene Yokota
fuente
2

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: Building Your Own CAB . Describe los patrones comunes: Vista pasiva, MVP, etc. y aborda algunas de las formas en que podría implementarlos en C #.

Jeremy
fuente
1

Puede probar MugenMvvmToolkit que permite utilizar un "MVVM puro" para WinForms. Debido al hecho de que admite enlaces en todas las plataformas, todas las características de enlace nativas disponibles para la plataforma WPF están disponibles en todas las plataformas (incluye WinForms).

Vyacheslav Volkov
fuente