web-dev-qa-db-fra.com

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

MVVM est le plus souvent utilisé avec WPF car il lui convient parfaitement. Mais qu'en est-il de 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? Existe-t-il un livre ou un article qui décrit bien cela? Peut-être basé sur MVP ou MVC?

152
bitbonk

J'ai essayé MVP et cela semble bien fonctionner 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 agiles en C # ...

Vous pouvez obtenir le code source sur Code source

MODIFIER:

Il existe deux variantes du modèle MVP (a) vue passive et (b) contrôleur superviseur.

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

Je recommande de jeter un coup d'œil au framework MVP suivant MVC # - Un framework MVP

Ne vous appelez pas par son nom (c'est un framework MVP).

Vidéo MVP winforms simple Winforms - MVP

Un exemple de traitement avec la liste déroulante MVP - DropDownList

Exemple simple de reliure en arborescence (reliure du pauvre). Vous pouvez ajouter toute logique spécifique à un arbre dans BindTree ().

Voici l'extrait de code .... non testé, directement saisi à partir d'une 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);
   }
}
91
rajesh pillai

Comme il a déjà été dit, je travaillais toujours dans un modèle MVP avec Winforms. Mais le modèle de conception que vous utiliserez ne signifie pas que vous utiliserez correctement. Il y a des tas d'anti-pattern attachés à MVP.

Si vous voulez que tout commence correctement, vous devez utiliser la structure 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 infrastructures clientes actuelles: 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 du MVP: http://blog.mattwynne.net/2007/06/13/mvp-smells/

J'espère que cela t'aides

14
alexl

Le modèle Modèle-View-ViewModel (MVVM) est un modèle de conception. Par définition, un modèle de conception représente une solution commune dans le monde orienté objet et cette solution peut être appliquée à diverses plates-formes (WPF, WinForms, Java Swing, etc.). Je conviens que MVVM est à utiliser de préférence avec WPF car il exploite les capacités de liaison avancées.Mais Windows Forms prend également en charge la liaison de données.

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

9
jbe

J'ai décrit une variante des modèles de conception MVP/MVVM appelée MVP-VM, une solution sur mesure pour les applications Winforms nécessitant une couverture de test complète et utilisant la liaison de données comme mécanisme principal pour maintenir la présentation à jour avec les données de 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 permettant 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.

5
Aviad Ezra

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

  • Screen Activator Pattern pour WindowsForms - vous pouvez le trouver ici , porté depuis Caliburn.Micro par jagui
  • Liaisons riches et convertisseurs de type - Truss par Kent Boogaart, le fait de manière indépendante de l'interface utilisateur
  • Commandes - WPF Application Framework (WAF) possède un projet WafWinFormsAdapter qui prend en charge certaines tâches de 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.

4

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

J'utilise MVP dans WinForms pour extraire du code de View - car je ne peux pas tester le code de View. Et aussi pour permettre au code qui doit être réutilisé (ou 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 . Bien que je sois sûr de ne pas l'utiliser parfaitement.

Vous avez mentionné que MVVM travaillait pour WPF. Je pense que la raison en est un support puissant de la liaison de données. Si vous n'utilisiez pas la 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 judicieux pour toute application côté client. Et peut-être un "meilleur" choix, même dans WPF, si vous envisagez de partager du code entre des projets qui ne sont pas WPF.

Pour plus de preuves de l'intérêt d'utiliser MVP dans WinForm, 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 à l'adresse http://msdn.Microsoft.com/en-us/magazine/cc188690.aspx

4
PandaWood

Vous pouvez utiliser Enterprise Architecture, Patterns and Practices comme point de départ, même s’ils sont légèrement datés.

Sous General Guidance (Conseils généraux), il y a Architecture d'application pour .NET: Conception d'applications et de services , qui constitue une bonne introduction aux méthodes .NET et aux applications en couches à plusieurs niveaux.

alt text http://i.msdn.Microsoft.com/ms954595.f00aa01%28en-us%2CMSDN.10%29.gif

Pour des "modèles" plus formels, il existe Modèles de solution d'entreprise utilisant Microsoft .NET . alt text
(source: Microsoft.com )

Pour en nommer quelques uns,

3
Eugene Yokota

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.

Celles-ci ne visent pas à masquer le modèle mais à définir avec précision les interactions entre les différentes couches des applications. Vous pouvez changer complètement le back-end et tant que vous passez d'un modèle dans Bindtree, votre interface utilisateur continuera à fonctionner.

Maintenant, 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, vous devez 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 d'entreprise utiles.

Là encore, la solution réside dans l’utilisation d’interfaces permettant de définir avec précision les interactions entre chaque couche.

Dans ma propre application (une application de CAO/FAO utilisée pour faire fonctionner des machines à couper le 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 des 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 de vue 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 du matériel, des chemins de coupe, des formes, des feuilles, des torches, etc.
  • Utilitaire; a DLL) qui utilise couramment les classes d’utilitaires utilisées par mon entreprise et qui couvrent différentes applications. Par exemple, des fonctions mathématiques complexes.
3
RS Conley

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

2
Jeremy

Vous pouvez essayer MugenMvvmToolkit qui permet d’utiliser un "MVVM pur" pour WinForms. En raison de la prise en charge des liaisons sur toutes les plateformes, toutes les fonctions de liaison natives disponibles pour la plate-forme WPF sont disponibles sur toutes les plateformes (y compris WinForms).

1