2010-08-09 14 views
5

Ho un WinForm e poche proprietà impostate su di esso.
ad esempio: nome, indirizzo sono accettati nel modulo.
(molte proprietà a esempio reale)Refactoring Form.ShowDialog() code a MVP

L'implementazione corrente è alquanto simile a

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.. 
} 

Come si converte questo per un'applicazione basata Winform MVP.
anche bisogno di refactoring trattamento fatto su ShowDialog() al presentatore/Modello
(dunno esattamente dove farlo)?
Inoltre, è necessario evitare di scrivere codice sul modulo stesso. (Vista passiva)

Grazie Tutti.

risposta

5

Sto ancora sperimentando con diversi MVP me si avvicina, ma il modo in cui sto facendo attualmente si è in questo modo:

frmName frmView = new frmName(); 

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

Tu dici che vuoi evitare di scrivere alcun codice sul modulo stesso, ma questo non ha senso per me. In Passive View, si passano tutte le richieste specifiche dell'applicazione al controller o al relatore.

In questo esempio, la vista gestisce la logica relativa alla vista . L'apertura della finestra di dialogo non è un'azione dell'utente che deve essere informata di qualsiasi altra cosa (come il presentatore). Proprio come aprire un menu contestuale, una finestra di dialogo fa parte di come questa particolare vista sceglie di offrire all'utente richieste specifiche dell'applicazione. Fino a quando l'utente non lo esegue e invia la richiesta, il relatore non ha bisogno di sapere nulla.

In alcune circostanze in cui ho dovuto essere in grado di gestire gli errori all'interno della finestra di dialogo stessa, ho passato l'oggetto IPresenter nel costruttore della finestra di dialogo. Può quindi fare in modo che il presentatore appropriato si chieda quando viene cliccato il pulsante "OK", ad esempio, e può mostrare una finestra di messaggio invece di chiudere in caso di errore.

Ci sono molte varianti su MVP, ma spero che questo aiuti. Buona fortuna con la creazione.

+0

thx per la risposta. Inoltre si può spiegare la gestione degli errori parte .. (3 ° paragrafo .. "In alcune circostanze dove ....") – Amitd

+0

@Amitd: nell'esempio di codice nella mia risposta, la richiesta dell'utente viene inoltrata al presentatore sopra * chiusura * della finestra di dialogo. Che cosa succede se quella richiesta genera un errore? Ad esempio, lo stesso nome e indirizzo sono già stati elaborati e salvati da qualche parte. Sembra meglio visualizzare l'errore all'interno della finestra di dialogo e consentire all'utente di cambiare il proprio nome o indirizzo, invece di dover aprire una * nuova * finestra di dialogo per riprovare. Puoi farlo passando il relatore nella finestra di dialogo, facendolo fare la richiesta stessa e chiudendolo solo se * non * genera un errore. – Rich

+0

@Rich: Oh ok. Quindi dovrò mantenere il presentatore come una proprietà della vista invece di creare un nuovo presentatore all'interno della vista? – Amitd