2010-08-09 6 views
5

J'ai un WinForm et quelques propriétés qui sont définies dessus.
par exemple: Nom, adresse sont acceptés sur le formulaire.
(beaucoup de propriétés dans l'exemple réel)Refactoring Form.ShowDialog() code à MVP

L'implémentation actuelle est un peu similaire à

frmName frmView = new frmName(); //frmName is WINFORM 
frmView.Name= "ABC"; //any valid string or read this from file 
frmView.Address="SomeAddress"; //any valid address or read this from file 

if (frmView.ShowDialog() == DialogResult.OK) 
{ 
    //OK CLICK PROCESS and 
    // get new values edited by user 
    string name = frmView .Name; 
    string address = frmView.Address; 
    doProcessing(name,address); 
} 
else{ 
    //Ignore cancel click.. 
} 

comment je ne convertir en une application Winform basée MVP.
ont également besoin de factoriser le traitement effectué sur ShowDialog() au présentateur/Modèle
(je sais pas exactement où de le faire)?
Également besoin d'éviter d'écrire du code sur le formulaire lui-même (vue passive)

Merci à tous.

Répondre

5

Je suis toujours à expérimenter avec différents MVP me approche, mais la façon dont je fais actuellement, il est comme ceci:

frmName frmView = new frmName(); 

if (frmView.ShowDialog() == DialogResult.OK) { 
    presenter.RequestProcessing(frmView.Name, frmView.Address); 
} else { 
    //Ignore cancel click.. 
} 

Vous dites que vous voulez éviter d'écrire un code sur la forme elle-même, mais cela n'a pas de sens pour moi. Dans Passive View, vous transmettez toutes les demandes spécifiques à l'application au contrôleur ou au présentateur.

Dans cet exemple, la vue gère la logique liée à la vue. L'ouverture de la boîte de dialogue n'est pas une action de l'utilisateur que tout autre élément (tel que le présentateur) doit être informé. Tout comme l'ouverture d'un menu contextuel, une boîte de dialogue fait partie de la façon dont cette vue particulière choisit d'offrir ces requêtes spécifiques à l'application à l'utilisateur. Jusqu'à ce que l'utilisateur l'exécute et soumette la demande, le présentateur n'a pas besoin de savoir quoi que ce soit.

Dans certaines circonstances où j'avais besoin de gérer des erreurs dans la boîte de dialogue elle-même, j'ai passé l'objet IPresenter dans le constructeur de la boîte de dialogue. Il peut alors faire lui-même la demande du présentateur approprié quand le bouton "OK" est cliqué, par exemple, et peut montrer une boîte de message au lieu de fermer en cas d'erreur.

Il y a beaucoup de variations sur MVP, mais j'espère que cela aidera. Bonne chance avec la mise en place.

+0

thx pour la réponse. Aussi s'il vous plaît pouvez-vous expliquer la manipulation des erreurs partie .. (3ème paragraphe .. "Dans certaines circonstances où ....") – Amitd

+0

@Amitd: Dans l'exemple de code dans ma réponse, la demande de l'utilisateur est transmise au présentateur lors de * la fermeture * de la boîte de dialogue. Que faire si cette requête entraîne une erreur? Par exemple, le même nom et l'adresse ont déjà été traités et enregistrés quelque part. Il semble préférable d'afficher l'erreur dans la boîte de dialogue et de permettre à l'utilisateur de changer son nom ou son adresse, au lieu d'avoir à ouvrir une boîte de dialogue * new * pour réessayer. Vous pouvez le faire en passant le présentateur dans la boîte de dialogue, en le faisant faire la demande elle-même, et en ne le fermant que si cela * ne provoque pas une erreur. – Rich

+0

@Rich: Oh ok. Donc, je devrai garder le présentateur comme une propriété de la vue au lieu de créer un nouveau présentateur dans la vue? – Amitd