說說WebForm:
數據列表控件:
它們的共同的設置數據源方法:
那么這個數據源的格式,究竟有啥要求?最簡單的方式是隨便給弄個,然后等它拋異常:
從上面的錯誤可以看的出來,基本上支持三種數據源綁定方式:IListSource,IEnumerable,IDataSource。
說說Winform
數據列表控件:
它們的共同的設置數據源方法:
用同樣的方式,發現它是死活不拋異常的,通過對DataGridView的DataSource查看代碼:
一個不夠再看一下ComboBox的DataSource:
從以上的提示可以得到信息,數據源支持:IListSource接口。
看看WPF
數據列表控件:
它們的共同的設置數據源方法:
對於WPF,它的ItemsSource不再是Object類型,而是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支持:
再說MDataTable
MDataTable是CYQ.Data 數據層框架里極重要的一組類,實現了和數據庫間的完整映射,同時也肩負着和各種UI打交道,當然了,沒有它我也不可能去研究各種綁定了。
對於自定義MDataTable數據源,在綁定列表控件的這條路上,幾年前我研究了很久,后來最穩定的實現為:
public class MDataTable : IDataReader, IEnumerable,IListSource
為何MDataTable在WPF下和DataTable一樣失效了?
但是結果為啥綁定無效?
解決的辦法:
由於IListSource的存在,會導致WPF無法正常綁定,那就把這接口去掉了,發現WPF就正常了。
但是問題又來了,Winform是靠IListSource接口才能綁定,去掉了IListSource,在winform下不正常了。
經過一番深思,考慮了DataTable依靠DataTableView的方式來綁定WPF,我亮出了一招:
說明:
總結:
雖然各位平時和這些列表控件相依為命,但估計研究綁定機制的,還是比較少的,畢竟需要一定的緣分。
今天的內容就當個參考,待某天緣分來的時候,有需要的時候,再來回顧我這篇文章亦可。