2010-08-09 20 views
5

Ich habe ein WinForm und einige Eigenschaften, die darauf festgelegt sind.
zum Beispiel: Name, Adresse werden auf dem Formular akzeptiert.
(viele weitere Eigenschaften in tatsächliches Beispiel)Refactoring Form.ShowDialog() Code zu MVP

Die aktuelle Implementierung zu

etwas ähnlich ist
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.. 
} 

Wie konvertiere ich dies zu einer MVP basierend Winform Anwendung.
müssen auch die Verarbeitung auf Showdialog() zum Moderator/Model
(weiß nich genau, wo es zu tun) getan Refactoring?
Vermeiden Sie es auch, Code in das Formular selbst zu schreiben. (Passive Ansicht)

Vielen Dank.

Antwort

5

Ich bin immer noch mit unterschiedlichen MVP experimentieren nähert sich selbst, aber die Art, wie ich zur Zeit, es zu tun habe, ist wie folgt:

frmName frmView = new frmName(); 

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

Sie sagen, Sie auf dem Formular vermeiden wollen selbst keinen Code schreiben, aber das ergibt für mich keinen Sinn. In Passive View übergeben Sie alle anwendungsspezifischen Anforderungen an den Controller oder Presenter.

In diesem Beispiel behandelt die Ansicht sichtbezogene Logik. Das Öffnen des Dialogfelds ist keine Benutzeraktion, über die etwas anderes (z. B. der Moderator) informiert werden muss. Wie beim Öffnen eines Kontextmenüs ist ein Dialogfeld Teil davon, wie diese bestimmte Ansicht diese anwendungsspezifischen Anforderungen an den Benutzer anbietet. Bis der Benutzer es tatsächlich durchmacht und die Anforderung einreicht, muss der Präsentator nichts wissen.

In einigen Fällen, in denen ich in der Lage sein musste, Fehler im Dialogfeld selbst zu behandeln, habe ich das Objekt IPresenter in den Konstruktor des Dialogfelds übergeben. Es kann dann den entsprechenden Präsentator selbst anfordern, wenn beispielsweise die Schaltfläche "OK" angeklickt wird, und kann im Falle eines Fehlers eine Meldungsbox anzeigen, anstatt sie zu schließen.

Es gibt viele Variationen über MVP, aber ich hoffe, das hilft. Viel Glück beim Einrichten.

+0

thx für die Antwort. Auch bitte können Sie die Behandlung von Fehlern Teil .. (3. Absatz .. "In einigen Fällen, wo ....") – Amitd

+0

@Amidd: Im Codebeispiel in meiner Antwort wird die Benutzeranforderung an den Referenten weitergeleitet nach * Schließen * des Dialogfelds. Was passiert, wenn diese Anfrage zu einem Fehler führt? Zum Beispiel wurde derselbe Name und dieselbe Adresse bereits verarbeitet und irgendwo gespeichert. Es sieht besser aus, den Fehler in dem Dialogfeld anzuzeigen und es dem Benutzer zu ermöglichen, ihren Name oder ihre Adresse zu ändern, anstatt ein * neues * Dialogfeld zu öffnen, um es erneut zu versuchen. Sie können dies tun, indem Sie den Präsentator in das Dialogfeld eingeben, indem Sie die Anforderung selbst machen und sie nur schließen, wenn sie * nicht zu einem Fehler führt. – Rich

+0

@Rich: Oh ok. Also muss ich den Moderator als eine Eigenschaft der Ansicht behalten, anstatt einen neuen Moderator in der Ansicht zu erstellen? – Amitd