2009-10-09 71 views
2

我以前處理WinForms應用程序的方式是將所有邏輯都引入表單本身。當你使用ListViews時,你會如何在Winforms中使用MVC模式?

我試圖開始利用我的WinForms應用程序的MVC/MVP做法。

有人可以告訴我一個例子,我將如何使用MVC/MVP結合說,一個ListView?我使用ListView自身的Tag屬性來存儲在ListView中表示的對象。

我意識到這是一個不好的做法,並將我緊緊地耦合到我的演示文稿中,但我無法擺脫它。

例如,我有一個「Loot History」ListView,它顯示了我從MMO中搶走的物品列表。我使用每個新ListView項的「Tag」屬性來存儲「Loot」對象本身。所以當我在戰利品中進行刪除或搜索時,我會搜索這個listview的標籤。

什麼是處理這種情況的正確方法是什麼?

我的控制器類應該保存在我的戰利品列表中,並將它提供給我的表單?控制器是否實例化/擁有該表單?如果沒有,那麼誰來實例化它?

回答

1

如果它的工作方式與ASP.NET MVC類似,那麼對這兩個問題的答案都是肯定的。控制器確實保留了你的項目列表,並負責實例化表單。

如果您想要「正確」,請查看Koossery.MVCwin如何做到這一點。他們對控制器聲明:

控制器是 手柄的用戶交互,與 模型的工作,並最終選擇以 渲染顯示UI組件。在MVC 應用程序中,視圖僅顯示 信息;控制器處理 並響應用戶輸入和 交互。例如, 控制器處理查詢字符串 值,並將這些值傳遞給 模型,該模型依次使用這些值查詢 數據庫。

參見https://stackoverflow.com/questions/2406/looking-for-a-mvc-sample-for-winforms

0

首先,你需要決定你要使用哪一種模式。 MVC和MVP略有不同。看看Twisting the Triad爲了一個很好的概述他們之間的差異。

MVP進一步分爲兩個變體:Supervising Presenter/ControllerPassive View。我傾向於更多地傾向於被動視角,但在適當的時候,我發現一些監督演示者/控制者混雜在我的作品中並不罕見。我喜歡被動視圖的原因是,它將盡可能多的代碼從UI中移出,並放入單獨的類中,以便更容易地進行單元測試。被動視圖歸結爲將數據操作委派給演示者,演示者通常會進一步將責任推遲到域對象。(不要與C#代表混淆,儘管這是實現它的一種方式)

複雜的UI控件(如ListView,DataGridView(及其前任DataGrid)和TreeView可能成爲MVP被動視圖的障礙,特別是(監督演示者/控制器通常可以使用數據綁定來處理這個問題)。

  • 它們顯示多個不同的數據值,這些值可能與單個域對象或多個域對象的屬性一致。
  • 他們很少有細粒度的事件來處理更新單個數據值。

有時候,最好的行動方式是找到一種顯示數據的替代方法。在某些情況下,您可以使用表單和導航控件替換顯示多行相關數據。其他時間不那麼清楚。根據我自己的經驗,我成功地使用了Tag屬性來保存對該List Item所表示的域對象的引用,而View並不知道它正在存儲的數據類型。我通過將對象的字段作爲系統類型和對象本身作爲普通的System.Object傳遞到View中的Add()方法來實現此目的。

在View中創建一個不可測試的方法可能與MVP的整個觀點相反,但它實際上只是一個用於多個屬性的setter。該方法內沒有數據操作或計算。所以幾乎沒有什麼可以做的測試。

希望這會有所幫助。

相關問題