Modèle de conception d'interface utilisateur pour Windows Forms (comme MVVM pour WPF)

159

MVVM est le plus couramment utilisé avec WPF car il lui convient parfaitement. Mais qu'en est-il des Windows Forms? Existe-t-il une approche / un modèle de conception établi et couramment utilisé comme celui-ci pour Windows Forms également? Celui qui fonctionne explicitement bien avec Windows Forms? Y a-t-il un livre ou un article qui décrit bien cela? Peut-être MVP ou MVC?

bitbonk
la source
voir aussi stackoverflow.com/questions/654722/…
Ian Ringrose
5
cela semble être une bonne question. voir les votes et les étoiles ..
nawfal
13
En quoi cela n'est-il pas constructif alors que c'est exactement la conversation que je recherchais? Modéré, pas dicte!
CAD bloke
Donc, fondamentalement, MVVM pour WinForms est possible. Mais la plupart des gens préfèrent parler de la façon dont ils ont utilisé MVP / MVC dans le passé, au lieu de faire avancer l'idée Winforms / MVVM. Ou ils s'attardent plutôt sur la façon dont on l'appelle vraiment Presenter Model et non sur MVVM, et à quel point MVVM est doux pour WPF.
H.Abraham Chavez
9
Je suis toujours déçu lorsque ce type de question est fermé comme "non constructif" car, comme un autre poster l'a déjà mentionné, ce type de discussion est exactement ce que je suis venu chercher ici. Modérateurs, veuillez adopter une vision plus libérale et relâcher le bouton «non constructif».
Tim Long

Réponses:

94

J'ai essayé MVP et il semble également fonctionner très bien avec les formulaires Windows. Ce livre contient un exemple de formulaires Windows avec modèle MVP (exemple d'application de paie). L'application n'est pas si complexe mais vous donnera une idée de la façon de la créer.

Principes, modèles et pratiques Agile en C # ...

Vous pouvez obtenir le code source au code source

ÉDITER:

Il existe deux variantes du modèle MVP (a) Vue passive et (b) contrôleur de supervision

Pour les scénarios de liaison de données complexes, je préfère utiliser le modèle de contrôleur de supervision. Dans le modèle de contrôleur de supervision, la responsabilité de la liaison de données incombe à la vue. Donc, pour treeview / datagrid, cela devrait être dans les vues respectives, seule la logique indépendante de la vue devrait être déplacée vers le présentateur.

Je vous recommande de jeter un œil au framework MVP suivant MVC # - Un framework MVP

N'allez pas par le nom (c'est un framework MVP).

Vidéo MVP Winforms simple Winforms - MVP

Un exemple de gestion de MVP de liste déroulante - DropDownList

Exemple de liaison d'arborescence simple (liaison de pauvre homme). Vous pouvez ajouter n'importe quelle logique spécifique à l'arborescence dans BindTree ().

Vous trouverez ci-dessous l'extrait de code .... non testé, directement saisi à partir de la pensée ....

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
la source
1
Merci, l'exemple de ce livre est un peu trop simple à mon goût. Comment pourrais-je procéder dans Winforms et MVP avec un affichage de données plus complexe tel que TreeView ou DataGridView, dans quelle mesure (quelle) logique résiderait-il?
bitbonk
bitbonk - J'ai mis à jour la réponse et vérifierai si je peux obtenir plus d'informations.
rajesh pillai
1
La méthode BindTree me semble un peu imparfaite. Soudain, la vue connaît le modèle. Est-ce une bonne chose? Il doit y avoir des tonnes de personnes confrontées à ce genre de problèmes. Je suis surpris qu'il n'y ait pas de livres à ce sujet. Puisqu'il existe des livres sur tout dans le monde .NET.
bitbonk
1
Ce n'est pas un défaut. Il s'agit de la variante "Contrôleur de supervision" du modèle MVP. Dans Contrôleur de supervision, la vue reconnaît le modèle (il s'agit d'un modèle de présentation). L'autre est "Passive View", où la vue est totalement découplée du modèle.
rajesh pillai
14

Comme il l'a déjà dit, j'ai toujours travaillé dans un modèle MVP lors de l'utilisation de Winforms. Mais le modèle de conception que vous utiliserez ne signifie pas que vous utiliserez correctement. Il y a beaucoup d'anti-pattern attaché à MVP.

Si vous voulez tout démarrer correctement, vous devez utiliser le framework pour créer un client intelligent. Je recommanderai donc d'utiliser cette conception et ces pratiques: Smart Client Software Factory http://www.codeplex.com/smartclient

Vous avez ici une discussion sur les frameworks de clients intelligents actuels: http://codebetter.com/blogs/glenn.block/archive/2008/05/10/prism-cab-and-winforms-futures.aspx

PS: j'aime ce post sur les anti-patterns MVP: http://blog.mattwynne.net/2007/06/13/mvp-smells/

J'espère que cela t'aides

alexl
la source
9

Le modèle Model-View-ViewModel (MVVM) est un modèle de conception. Par définition, un modèle de conception montre une solution commune dans le monde orienté objet et cette solution peut être appliquée dans diverses plates-formes (WPF, WinForms, Java Swing, etc.). Je conviens que MVVM est mieux utilisé avec WPF car il tire parti des capacités de liaison fortes. Cependant, Windows Forms prend également en charge la liaison de données.

L' adaptateur Windows Forms WAF montre comment appliquer le modèle MVVM dans une application Windows Forms.

jbe
la source
3
Le WAF est pour WPF, pas Windows Forms. Le lien est trompeur.
Bentley Davis
2
Le lien n'est pas trompeur. L'adaptateur WAF Windows Forms est fourni avec une application MVVM qui est implémentée deux fois: 1. WinForms; 2. WPF. Les deux applications partagent les couches inférieures qui sont indépendantes de la technologie d'interface utilisateur.
jbe
5

J'ai écrit sur une variante des modèles de conception MVP / MVVM appelée MVP-VM, qui est une solution sur mesure pour les applications winforms qui nécessitent une couverture de test complète et utilisent la liaison de données comme mécanisme principal pour maintenir la présentation à jour avec les données du modèle.

MVVM pour .NET Winforms

MVVM (Model View View Model) introduit une approche similaire pour séparer la présentation des données dans un environnement qui autorise la liaison de données (WPF). Étant donné que .NET Framework 2.0 offre déjà une infrastructure de liaison de données avancée qui permet également la liaison au moment de la conception des objets d'application, l'entité `` View Model '' peut très bien s'intégrer dans un environnement basé sur MVP.

Aviad Ezra
la source
4

J'ai posé la même question à deux de mes collègues techniciens: est-ce que MVVM pour WindowsForms est possible? Les deux m'ont donné exactement la même réponse: " Pas question! WindowsForms manque les riches liaisons de WPF et Silverlight (OneTime, OneWay, TwoWay, OnewayToSource) et il manque également les TypeConverters ."

  • Screen Activator Pattern pour WindowsForms - vous pouvez le trouver ici , porté depuis Caliburn.Micro par jagui
  • Rich Bindings and TypeConverters - Truss de Kent Boogaart, le fait de manière indépendante de l'interface utilisateur
  • Commandes - WPF Application Framework (WAF) a un projet WafWinFormsAdapter qui prend en charge certains éléments MVVM, à savoir les commandes

Encore une fois, pouvons-nous avoir MVVM pour WinForms? Oui nous pouvons. Nous avons toutes les pièces. Nous devons juste les coller ensemble.

Tiago Freitas Leal
la source
4

Je crois que MVP est un modèle bien adapté au développement de WinForms - comme en témoigne en partie son utilisation dans CAB - le cadre de Microsoft pour WinForms.

J'utilise MVP dans WinForms pour extraire le code de la vue - car je ne peux pas tester le code de la vue. Et aussi pour permettre au code qui doit être réutilisé (ou qui est dupliqué) de rester en dehors de la vue où il ne peut pas être partagé.

Je peux me référer à mon propre projet où j'utilise le modèle MVP ExceptionReporter.NET . Même si je suis sûr que je ne l'utilise pas parfaitement.

Vous avez mentionné que MVVM fonctionnait pour WPF - je pense que la raison en est une prise en charge solide de la liaison de données. Si vous n'utilisiez pas de liaison de données dans WPF (et ce n'est certainement pas obligatoire), vous pouvez choisir MVP. Le fait est que MVP est un choix fort pour toute application côté client. Et peut-être un `` meilleur '' choix, même dans WPF, si vous prévoyez de partager du code entre des projets qui ne sont pas WPF.

Pour plus de preuves de la valeur de l'utilisation de MVP dans WinForms, voir la présentation vidéo de Boodhoo sur l'utilisation de MVP: http://www.bestechvideos.com/2008/06/29/dnrtv-show-14-jean-paul-boodhoo-on-model -view-presenter Et un article MSDN du même auteur sur http://msdn.microsoft.com/en-us/magazine/cc188690.aspx

PandaWood
la source
Les trucs de Boodhoo semblent concerner WebForms, pas WinForms. À moins qu'il y ait plus de choses plus tard dans la vidéo ...?
Roger Lipscombe
3

La méthode BindTree me semble un peu imparfaite. Soudain, la vue connaît le modèle. Est-ce une bonne chose? Il doit y avoir des tonnes de personnes confrontées à ce genre de problèmes. Je suis surpris qu'il n'y ait pas de livres à ce sujet. Puisqu'il existe des livres sur tout dans le monde .NET.

Il ne s'agit pas de masquer le modèle en définissant plutôt précisément les interactions entre les différentes couches des applications. Vous pouvez modifier complètement le backend et tant que vous passez un modèle via Bindtree, votre interface utilisateur continuera à fonctionner.

Or, la classe Model peut être un mauvais choix de nom dans l'exemple donné par Rajesh. Il peut s'agir de TreeData ou RecordsData. Quelle que soit la façon dont vous le définissez, il a ce dont vous avez besoin pour utiliser le mécanisme de liaison de Winforms pour lier un contrôle spécifique aux données sous-jacentes.

Le meilleur site pour rechercher ce type de matériel est ici . Martin Fowler a rassemblé une variété de modèles de conception d'interface utilisateur et de modèles de conception d'entreprise utiles.

Encore une fois, la clé pour cela est l'utilisation d'interfaces pour définir précisément comment chaque couche interagit les unes avec les autres.

Dans ma propre application (une application CAD / CAM utilisée pour faire fonctionner des machines de découpe de métal), ma structure ressemble à ceci.

  • Formulaires implémentant des interfaces de formulaire
  • UIDLL avec des vues implémentant des interfaces de vue qui interagissent avec les formulaires via l'interface de formulaire. Les vues spécifiques s'enregistrent avec UIViewDLL Views exécute les objets de commande trouvés dans les bibliothèques de commandes qui interagissent avec le modèle.
  • Bibliothèques de commandes; listes de commandes implémentant ICommand. La commande qui interagit avec les vues le fait via les interfaces exposées dans UIViewDLL.
  • UIViewDLL; expose les interfaces d'affichage utilisées par les commandes.
  • Modèle; les classes et la collection qui constituent les structures de données de base de mon application. Pour moi, ce sont des choses comme le matériau, les chemins de coupe, la forme, les feuilles, les torches, etc.
  • Utilitaire; une DLL qui a couramment utilisé des classes utilitaires utilisées par mon entreprise qui couvrent différentes applications. Par exemple, des fonctions mathématiques complexes.
RS Conley
la source
3

Vous pouvez utiliser l' architecture d'entreprise, les modèles et les pratiques comme point de départ, bien qu'ils soient légèrement datés.

Sous Directives générales, il y a Architecture d'application pour .NET: Conception d'applications et de services , qui est une bonne introduction aux méthodes .NET et aux applications N-tier en couches.

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

Pour des «modèles» plus formels, il existe des modèles de solutions d'entreprise utilisant Microsoft .NET . (source: microsoft.com )texte alternatif

Pour n'en nommer que quelques-uns,

Eugene Yokota
la source
2

La première bonne explication des modèles de conception d'interface utilisateur que j'ai lue était dans le blog de Jeremy Miller - Construire votre propre CAB . Il décrit les modèles courants - Vue passive, MVP, etc. et aborde certaines des façons dont vous pouvez les implémenter en C #.

Jérémie
la source
1

Vous pouvez essayer MugenMvvmToolkit qui permet d'utiliser un "pur MVVM" pour WinForms. En raison du fait qu'il prend en charge les liaisons sur toutes les plates-formes, toutes les fonctionnalités de liaison natives disponibles pour la plate-forme WPF sont disponibles sur toutes les plates-formes (y compris WinForms).

Vyacheslav Volkov
la source