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