2012-01-31 65 views
4

我重構了一個WinForms(.NET 4)應用程序,該應用程序使用TabControl來包含UserControl - UserControl在每個TabPage中實例化,最終結果爲每個選項卡中的編輯。它們正在編輯一組項目,這些項目最終將作爲一個整體輸入到正在編輯的對象中。謙虛視圖/ MVP與WinForms和用戶控件集合

作爲示例類結構:

  • class School
    • string Name
    • string Address
    • Course s,各與幾個相應的字段(DepartmentName等)收集

(這實際上不是一個學校相關的應用程序,但隱喻的作品。)

在視覺上,集用戶控件的管理Course ES,而父窗體處理School信息。

現在,我有一個Form/School的演示者,並且是UserControl/Course的演示者,併爲每個人提供了一個視圖。然而,學校的演示者需要控制課程的一些信息。例如,爲一個課程選擇的選項會限制其他選項。 School模型正在處理該計算,但需要到課程的演示者。

我在MVP討論中沒有找到這種類型關係的例子,這是我第一次採用MVP方法。處理這個問題有什麼好的選擇?學校的主持人有沒有收集課程的主持人來代表這組作品?學校的觀點是否應該收藏這些課程的觀點? (最終的用戶控件必須以某種方式和某處連接到表單上,對嗎?)

我的主要目標是(不出所料)增加可測試性和可維護性,到目前爲止,這個過程中的主要來源是Michael Feathers的「The謙遜的對話框「和傑里米米勒的」建立你自己的CAB「系列。

回答

2

我如何處理類似的情況是父母提交者應該知道孩子主持人(作爲構造函數依賴關係)。

每個孩子演示者視圖,所以在父演示我的邏輯是這樣的:

初始化() - 初始化父 - 調用初始化每個孩子主持人(這是獲取所有必要的數據EXCEPT主要顯示的數據例如,如果您有發票主講者,則需要從某處獲取客戶集合,如果您有客戶組合框,以便您可以更改發票) - 將子視圖嵌入到父視圖中父母通常是一種形式,其中兒童是用戶控件)

然後在通常在加載父對象時,使用一些LoadXXX方法,我也加載子對象。在你的例子中,它會像

schoolPresenter。LoadSchool(學校)

這反過來加載數據在所有主持人,與學校的詳細信息例如負載父控件,該課程集合傳遞到課程演示等等

一想,我注意到了這一點很好的做法是在每個演示者上都有一個Refresh()方法,它們基本上知道如何根據當前狀態加載自己。也許你不能在父母主持人這樣的方法,但簡單的主持人這樣工作很好,這意味着在LoadSchool方法中,你可以有類似

coursesPresenter.Courses = school.Courses; coursesPresenter.Refresh();

+1

我對這個令人難以置信的慢反應表示歉意。這個問題解決得很好,而且是可以測試的。謝謝! – 2012-02-20 20:55:02