2009-10-09 5 views
2

Mon ancienne façon de gérer l'application WinForms était de jeter toute la logique dans la forme elle-même. J'essaie de commencer à utiliser les pratiques MVC/MVP avec mes applications WinForms. Quelqu'un peut-il me montrer un exemple de comment j'utiliserais MVC/MVP en conjonction avec say, un ListView? J'utilise pour utiliser la propriété Tag de ListView lui-même pour stocker les objets représentés dans le ListView. Je me rends compte que c'est une mauvaise pratique et me couple étroitement à ma présentation mais j'ai du mal à m'en libérer. Par exemple, j'avais un ListView "Loot History" qui montrait une liste d'objets que j'avais pillés d'un MMO. J'utilisais la propriété "Tag" de chaque nouvel élément ListView pour stocker l'objet "Loot" lui-même. Donc, lorsque j'ai effectué une suppression ou une recherche parmi le butin, je voudrais rechercher les balises de cette liste.Comment utiliseriez-vous le modèle MVC avec Winforms quand il s'agit d'utiliser ListViews?

Quelle est la bonne façon de gérer cette situation?

Mon cours de contrôleurs doit-il contenir une liste de mes objets de butin, et il les fournit à mon formulaire? Est-ce que le contrôleur instancie/possède le formulaire? Si non, alors qui l'instancie?

Répondre

1

Si cela fonctionne de manière similaire à ASP.NET MVC, la réponse à vos deux questions est oui. Le contrôleur conserve une liste de vos éléments et est responsable de l'instanciation du formulaire.

Si vous voulez être "correct", alors vérifiez comment Koossery.MVCwin le fait. Leur déclaration sur les contrôleurs:

contrôleurs sont les composants poignée interaction de l'utilisateur, le travail avec le modèle , et, finalement, sélectionnez une vue de rendre qui affiche l'interface utilisateur. Dans une application MVC , la vue affiche uniquement les informations ; le contrôleur gère et répond à l'entrée de l'utilisateur et à l'interaction . Par exemple, le contrôleur gère les valeurs de la chaîne de requête et transmet ces valeurs au modèle , qui à son tour interroge la base de données en utilisant les valeurs.

Voir aussi https://stackoverflow.com/questions/2406/looking-for-a-mvc-sample-for-winforms

0

D'abord, vous devez décider quel modèle votre allez utiliser. MVC et MVP sont légèrement différents. Jetez un oeil à Twisting the Triad pour un bon aperçu des différences entre eux. MVP est subdivisé en deux variantes: Supervising Presenter/Controller et Passive View

J'ai tendance à pencher davantage vers la vue passive, mais il n'est pas rare de trouver un présentateur/contrôleur superviseur mélangé dans mon travail lorsque cela est approprié. La raison pour laquelle j'aime la vue passive, c'est qu'elle retire le plus de code possible de l'interface utilisateur et les classe dans des classes séparées, où elle peut être testée plus facilement. Passive View se résume à déléguer des opérations de données au Presenter, qui délègue généralement davantage la responsabilité aux objets de domaine.(à ne pas confondre avec les délégués C# bien que ce soit un moyen de l'accomplir)

Les contrôles d'interface utilisateur complexes comme ListView, DataGridView (et son prédécesseur DataGrid) et TreeView peuvent être un obstacle pour MVP Passive View en particulier (Supervision Presenter/Le contrôleur peut généralement utiliser la liaison de données pour gérer cela). Ils affichent plusieurs valeurs de données distinctes qui peuvent coïncider avec les attributs d'un objet de domaine unique ou d'objets de domaine multiples.

  • Ils ont rarement des événements fins pour gérer la mise à jour des valeurs de données individuelles. Il est parfois préférable de trouver une autre méthode pour afficher les données. Il est parfois préférable d'utiliser une autre méthode. Dans certains cas, vous pouvez remplacer l'affichage de plusieurs lignes de données associées avec un formulaire et des contrôles de navigation. D'autres fois ce n'est pas si clair. Dans mes propres expériences, j'ai réussi à utiliser la propriété Tag pour contenir des références à l'objet de domaine représenté par cet élément de liste sans que la vue ne sache rien du type de données qu'il stockait. J'ai accompli cela en passant les champs de l'objet à afficher en tant que types de systèmes et l'objet lui-même en tant que System.Object simple dans une méthode Add() dans la vue.

    La création d'une méthode non testable dans la vue peut sembler aller à l'encontre de l'ensemble du point de MVP, mais il s'agit simplement d'un setter pour plusieurs attributs. Aucune manipulation de données ou calculs ne se produisent dans la méthode. Il y a donc peu de tests qui pourraient être effectués de toute façon.

    Espérons que cela aide.

  • Questions connexes