利用午休时间继续把过去写的一些代码翻出来讲一说,文章可能写的比较简略,可是我会努力把核心意思表达清楚,具体代码可直接访问 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