2010-08-04 8 views
1

J'ai une application qui a une fenêtre similaire à celle ci-dessous.GUI Design Pattern, MVP, Tabulation

alt text http://a.imageshack.us/img137/7481/screenshotxh.jpg

L'exigence est que lorsque l'utilisateur clique sur le bouton tout Enregistrer doit être sauvé. Les boutons "Enregistrer" et "Réinitialiser" sont "communs" à tous les onglets. Par conséquent, lorsque l'onglet "Informations personnelles" est sélectionné et que "Enregistrer" est cliqué, le programme doit également enregistrer les modifications effectuées dans l'onglet "Amis" et les modifications apportées dans l'onglet "Historique de l'emploi".

L'application du code a déjà pour ce qui suit et je veux conserver ce code:

-PersonalInformationView, PersonalInformationPresenter, PersonalInformationModel

-FriendsView, FriendsPresenter, FriendsModel

-EmploymentHistoryView, EmploymentHistoryPresenter, EmploymentHistoryModel

Chaque présentateur a une méthode Save.

La question est ce qui serait un bon modèle de conception à utiliser en prenant en considération que je veux garder le code que j'ai déjà. Aussi, je veux que cette fenêtre ait aussi un modèle, une vue, un présentateur. Ou peut-être que je devrais reformuler ma question un peu: quelle est la meilleure façon d'inclure "sous-vues", "sous-présentateurs" lors de la programmation MVP?

Cordialement, MadSeb

Répondre

0

Je voudrais faire votre nouveau présentateur prendre dans vos sous présentateurs comme arguments du constructeur, quelque chose comme:

class DialogPresenter { 

    private readonly IDialogView view; 
    private readonly PersonalInformationPresenter personal; 
    private readonly FriendsPresenter friends; 
    private readonly EmploymentHistoryPresenter history; 

    void DialogPresenter(IDialogView view, PersonalInformationPresenter personal, FriendsPresenter friends, EmploymentHistoryPresenter history) { 
     this.view = view; 
     this.personal = personal; 
     this.friends = friends; 
     this.history = history; 
    } 

    bool Display() { 
     this.personal.Display(); 
     this.friends.Display(); 
     this.history.Display(); 

     return this.view.Display() == DialogResult.Ok; 
    } 

    void Save() { 
     this.personal.Save(); 
     this.friends.Save(); 
     this.history.Save(); 
    } 
} 

Bien sûr , si vos présentateurs avaient une interface commune entre eux, cela pourrait être simplifié (et en plus extensible) comme ceci:

class DialogPresenter { 

    private readonly IDialogView view; 
    private readonly IPresenters[] presenters; 

    void DialogPresenter(IDialogView view, IPresenters[] presenters) 
    { 
     this.view = view; 
     this.presenters = presenters; 
    } 

    bool Display() { 
     foreach (var item in this.presenters) 
      item.Display(); 

     return this.view.Display() == DialogResult.Ok; 
    } 

    void Save() { 
     var validation = new List<string>(); 

     foreach (var item in this.presenters) 
      validation.AddRange(item.Validate()); 

     if (validation.Count > 0) { 
       _view.ShowErrors(validation); 
       return; 
     } 

     foreach (var item in this.presenters) 
      validation.AddRange(item.Save()); 
    } 
} 

Edit: Indicatif téléphonique serait Someth ing comme ceci:

void DisplayForm() { 

    using (var frm = new frmDisplay) { 

     //or just use DI to get the models etc 
     var personal = new PersonalInformationPresenter(personalModel, frm.PersonalTab); //some properties to expose your views 
     var friends = new FriendsPresenter(friendslModel, frm.FriendsTab); 
     var history = new EmploymentHistoryPresenter(employmentHistoryModel, frm.HistoryTab); 

     var presenter = new DialogPresenter(frm, personal, friends, history); 
     if (presenter.Display()) {  
      presenter.Save(); 
     } 
    } 
} 

espoir qui est de certains inpsiration/help :)

+0

Cela constitue une source d'inspiration. Cependant, j'ai le problème suivant avec ceci. La méthode "Save" de chaque présentateur effectue la validation des données avant l'enregistrement et en cas d'échec * view.DisplayValidationErrors() * est appelée et une msgbox est affichée ("Code postal est manquant." Etc) Si je choisis d'utiliser le code que vous avez suggéré l'utilisateur recevra un msg.box pour les erreurs de validation dans le premier onglet, un msg.box pour les erreurs de validation dans le deuxième onglet .. mais je veux toutes les erreurs de validation agrégées dans un seul msg.box. – MadSeb

+0

J'ai mis à jour ma réponse (deuxième bloc de code) pour montrer comment je gère ce – Pondidum

1

Personnellement, je suggère faire une interface abstraite, ISaveable ou osmething et veiller à ce que chacun des présentateurs mettre en œuvre, que de passer par chaque présentateur comme un objet de ISaveable et enregistrez chacun.

+0

..mais du présentateur de la « vue principale » Je n'ai pas accès aux présentateurs des « vues sous "(PersonalInformationView, FriendsView, EmploymentHistoryView) ..J'ai seulement accès aux" sous-vues "eux-mêmes ... – MadSeb

0

Ma suggestion est de créer ISaveableView avec la méthode save. Chacune de vos vues implémentera l'interface. Je suppose que vos onglets implémente les vues que vous avez décrites. Lorsque vous cliquez sur le bouton Enregistrer, vous pouvez lancer l'onglet actif pour ISaveableView et appeler sa méthode save

+0

salut, c'est une bonne réponse mais la méthode" Save "ne fait pas partie de la vue mais fait partie du présentateur. ........mais je suppose que je peux faire une "Save" méthode dans la vue et cette méthode appellerait le "Save" du présentateur. – MadSeb

Questions connexes