2010-08-09 35 views
5

我有一個WinForm和幾個屬性設置它。
例如:姓名,地址在表格上被接受。
(以實際的例子很多屬性)重構Form.howDialog()代碼到MVP

當前的實現在某種程度上類似於

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

我如何將它轉換爲一個基於MVP WinForm應用程序。
還需要重構的的ShowDialog()做演示/型號
的處理(說不上來究竟在何處做)?
還需要避免在窗體本身上編寫代碼。(被動查看)

謝謝所有。

回答

5

我仍然有不同的嘗試MVP接近自己,但我目前做的方式是像這樣:

frmName frmView = new frmName(); 

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

你說你想避免書面形式本身上的任何代碼,但這對我來說沒有意義。在Passive View中,您將所有應用程序特定請求傳遞給控制器​​或演示者。

在此示例中,視圖處理與視圖相關的邏輯。打開對話框不是一個用戶操作,其他任何人(例如演示者)都需要被通知。就像打開一個上下文菜單一樣,一個對話框是這個特定視圖如何選擇向用戶提供這些特定於應用程序的請求的一部分。在用戶實際完成並提交請求之前,演示者不需要知道任何內容。

在某些需要能夠處理對話框本身內部錯誤的情況下,我已將IPresenter對象傳遞給對話框的構造函數。例如,當單擊「確定」按鈕時,它可以讓相應的演示者自己請求自己,並且可以顯示消息框而不是在發生錯誤時關閉。

有很多MVP的變化,但我希望這可以幫助。祝你好運,建立起來。

+0

thx回答。 也請你解釋處理錯誤的部分.. (第3段..「在某些情況下......」) – Amitd 2010-08-09 11:41:22

+0

@Amitd:在我的答案的代碼示例中,用戶請求被轉發給演示者*關閉*對話框。如果該請求導致錯誤,該怎麼辦?例如,同一名稱和地址已經被處理並保存在某個地方。從對話框中顯示錯誤並允許用戶更改其名稱或地址,而不是必須打開* new *對話框才能重試。您可以通過將演示者傳遞到對話框中,讓它自己發出請求,並且只有在*不會導致錯誤時才關閉它。 – Rich 2010-08-09 11:55:32

+0

@Rich:哦,好的。所以我需要讓主持人成爲視圖的屬性,而不是在視圖內部創建新的主持人? – Amitd 2010-08-09 12:51:21