.NET各大平臺數據列表控件綁定原理及比較(WebForm、Winform、WPF)

說說WebForm:

數據列表控件:數據庫

WebForm 下的列表綁定控件基本就是GridView、DataList、Repeater;固然還有其它DropDownList、ListBox等。

 

它們的共同的設置數據源方法:框架

XXX.DataSource=數據源。

 

那麼這個數據源的格式,究竟有啥要求?最簡單的方式是隨便給弄個,而後等它拋異常:spa

 

 

從上面的錯誤能夠看的出來,基本上支持三種數據源綁定方式:IListSource,IEnumerable,IDataSource。設計

 

說說Winform

數據列表控件:3d

WinForm 下的列表綁定控件基本就是DataGridView、ListView、ComboBox等。

 

它們的共同的設置數據源方法:調試

XXX.DataSource=數據源。 

 

用一樣的方式,發現它是死活不拋異常的,經過對DataGridView的DataSource查看代碼:code

 一個不夠再看一下ComboBox的DataSource:orm

 

從以上的提示能夠獲得信息,數據源支持:IListSource接口。對象

 

看看WPF

數據列表控件:blog

WPF 下的列表綁定控件基本就是DataGrid、ListBox、ComboBox等。

 

它們的共同的設置數據源方法:

XXX. ItemsSource =數據源。  

 

對於WPF,它的ItemsSource再也不是Object類型,而是IEnumerable:

從以上的提示能夠獲得信息,數據源支持:IEnumerable接口。


三者比較:

WebForm: IListSource,IEnumerable,IDataSource。

Winform: IListSource

WPF:   IEnumerable

 

共同點:

因爲IListSource的接口有個必須的實現是返回IList,而IList接口自己也有繼承自IEnumerable接口。

因此最終的共同點就是都IEnumerable接口,通俗的說就是都支持:List<T>集合這樣的數據源。

 

不一樣點:(以IDataReader,DataTable,DataSet等通用集合來講明)

WebForm:支持IDataReader,DataTable,DataSet。

Winform:不支持IDataReader, 支持DataTable,DataSet。 

WPF:支持IDataReader,不支持DataTable,DataSet。

 

這裏面又有些故事:

 

Winform:爲蝦米不支持IDataReader?

對於DataGridView列表控件,其實表格是能夠直接修改的,並且修改的值,會直接返改到綁定的數據源上。

可能出於這種性質,對於只讀的IDataReader來講,它不太適合DataGridView控件上的讀寫雙需求,因此不支持。

 

Winform下的DataTable綁定:

對於List<T>,能夠方便的修改集合的屬性,而對於DataTable,這是個複雜的自定義類,要綁定的東西並非表的基本屬性,而是存在另外一個集合DataRowCollection中。

因此,設計人員搞出了:PropertyDescriptor 和ICustomTypeDescriptor等一套規範來實現屬性描述和自定義類的取值綁定問題。

 

WPF:居然不考慮DataTable支持:

估計雙方沒溝通好,或者是考慮到新的DataGrid又返樸歸真,去掉了寫的需求,WPF居然不支持DataTable, 好在還有個屬性DefaultView,能夠把信息讀到相似集合的DataView再去綁定,雖然多轉了一步,但也算是勉強支持綁定了。

 

再說MDataTable

MDataTable是CYQ.Data 數據層框架裏極重要的一組類,實現了和數據庫間的完整映射,同時也肩負着和各類UI打交道,固然了,沒有它我也不可能去研究各類綁定了。

對於自定義MDataTable數據源,在綁定列表控件的這條路上,幾年前我研究了好久,後來最穩定的實現爲:

public class MDataTable : IDataReader, IEnumerable,IListSource

 

爲什麼MDataTable在WPF下和DataTable同樣失效了?

這裏其實有一個和DataTable不一樣的東西,就是個人自定義數據源繼承了IDataReader和IEnumerable,簡單的說是支持WPF的。

 

可是結果爲啥綁定無效? 

通過代碼調試,發現了原來是接口的優先級問題熱的禍, IListSource的級別比IEnumerable的先被調用了,結果就走了相似DataTable那一套規則,但那一套規則的屬性讀取和WPF是無效的,結果就變成了屬性綁定,而不是數據行綁定。

 

解決的辦法:

因爲IListSource的存在,會致使WPF沒法正常綁定,那就把這接口去掉了,發現WPF就正常了。

可是問題又來了,Winform是靠IListSource接口才能綁定,去掉了IListSource,在winform下不正常了。

通過一番深思,考慮了DataTable依靠DataTableView的方式來綁定WPF,我亮出了一招:

 

 

說明:

把IListSource接口的實現,分到了另外一個類 MDataTableView,注意修飾爲內部類,說明對於使用者來講,一切是仍是照舊,可是內部在MDataTable.Bind方法調用是有識別當前的平臺,若是是Winform,則把對象變動爲:new MDataTableView(ref sourceObje)

 

總結:

雖然各位平時和這些列表控件相依爲命,但估計研究綁定機制的,仍是比較少的,畢竟須要必定的緣分。

今天的內容就當個參考,待某天緣分來的時候,有須要的時候,再來回顧我這篇文章亦可。 

相關文章
相關標籤/搜索