利用午休時間繼續把過去寫的一些代碼翻出來講一說,文章可能寫的比較簡略,可是我會努力把核心意思表達清楚,具體代碼可直接訪問 Github 獲取。git
Github 地址:https://github.com/iccb1013/Sheng.Winform.Controls.Controller程序員
這些代碼是針對 WinForm 寫的,但稍加改動便可應用於 WPF 開發中。github
提到控制器,咱們可能會首先想到流行的 MVC 開發中的控制器 Controller。對於 MVC 開發來講,咱們把工程結構劃分爲 模型、視圖、控制器。這是比較宏觀的工程角度的劃分,那麼對於一些小範圍的,更具體的編碼問題,這樣的模式是否可以借鑑呢?答案是確定的。函數
在咱們的客戶端應用程序開發中,可能會涉及大量的控件操做的代碼,如 TreeView,DataGridView,ListBox 等等,這些控件雖然都提供了基本的數據操做接口,可是這些接口的功能都很是的基礎和簡單,考慮以下操做:post
這些操做有一個重要的共同點,都是針對「數據」進行操做,可是基本的的控件接口,沒有這麼多功能,既有的接口也可能是以 object 做爲參數來操做的,若是要實現這些功能,不少時候程序員須要寫一些「業務代碼」來完成,在業務代碼中迭代數據源,寫條件判斷,作類型轉換,最後調用控件的基本操做接口。編碼
一般代碼看起來以下圖這樣:spa
那麼這些共通的功能,是否可以抽象出來呢?因而咱們能夠考慮繼承這些控件,來添加咱們想要的功能:orm
咱們把這些共通的操做,實如今繼承的控件中,而後在項目中使用本身實現的控件,這不失爲一個辦法,可是經過繼承來實現這樣的功能,有很大的缺陷:對象
這裏要引出一句話:對象的複合優於對象的繼承。blog
咱們使用複合不一樣的對象(控件和控制器)的方法,來解決這個問題:
咱們能夠爲不一樣的控件,實現它們對應的「控制器」,而後在控制器中,實現咱們的這些方法,這樣作能夠最大程度的得到靈活性與可控性,咱們直接使用原生(或第三方控件)來開發項目,而後在代碼中,爲控件初始化一個控制器,接下來使用控制器來操做控件,對於上文提到的除了共通的操做外,還須要某些特定的操做的狀況,能夠實現爲不一樣的控制器進行操做。
看一個控制器實現的代碼示例,這是一個支持經過類型(Type)來呈現和操做數據的 DataGirdView 的控制器:
使用構造函數接收一個原生的 DataGridView 控件實例來包裝它,及時是第三方控件,只要它是繼承自 DataGridView 的,就能夠直接使用。
接下來就能夠直接使用控制器中的諸多方法,來操做控件,實現咱們上文中提到的諸多功能。
代碼的具體實現其實並不複雜,而且代碼寫於不少年前,有些細節的實現如今看來也並不是最佳,只爲拋磚引玉,輕拍。
具體的代碼實現能夠訪問個人 Github 獲取,包括:
你能夠直接使用這些代碼,也能夠參考這些代碼和本文所提出的思路,實現更多的控件控制器。
Q:279060597 @南京
http://sheng.city/post/github-winform-wpf-sheng-winform-controls-controller