最近用WPF的DataGrid的時候,發現一個很弱智的問題,DataGrid的ItemsSource是綁定了一個屬性:
然後取數給這個集合賦值的時候,第一次賦值,就會出現列移位
起初還以為是顯卡的問題,結果今天來集成顯卡的電腦上也一樣出現,具體原因不詳,以下是幾種解 決辦法:
1.(首選,有效果)DataGrid的RowHeaderWidth="0",必須賦值為0,不能不賦值,也不能 賦其他值。
2.(有效果)綁定的源一開始就要賦值,即至少要有一行數據。
3.(效果不一,有的地方有效有的地方無效)不用綁定,每次獲得數據後手動賦ItemsSource的值。
4.(有效,比較繁瑣)把每一條數據封裝成對象,DataGrid封裝成列模板,每一列綁定這個對象的屬 性。
對於使用DataTable還是用集合做為數據源,總結以下幾點:
a)綁定DataTable的DefaultView有幾個個好處:
1.方便,直接取數綁給目標,不需要再轉成集合給目標每一列綁定。
2.易替換,如果要增減列,只需要改取數語句,界面不需改動。
3.相對於轉換成集合來說理論上節省性能。
4.在大數據量下,如果前後兩次獲取的數據源沒有變動,不會重繪UI,而集合的話每次都會重繪。
缺陷:
1.需要代碼設置每一列的列寬,否則UI會很難看,全擠在一起。(代碼設置的過程可能會消耗性能) 。
2.無數據時UI的數據區域什麼都沒有,一片空白,影響用戶體驗。
適用的地方:一般是使用在數據量大、不需要操作數據的地方,只是單純的顯示。
b)綁定集合的好處:
1.UI裡可以直接設置列寬,不需要代碼再設。
2.不存在列位移的現象(至今未發現)。
3.無數據時UI上也會有列頭。
4.可以靈活使用列模板。
缺陷:
1.UI和集合數據列綁死,增減列需要動UI。
2.取到數據之後還要轉換成集合,理論上耗能。
3.步驟繁瑣,需要將數據條目封裝成對象,如果字段很多就煩了。
適用的地方:數據量不大、需要操作數據,比如要加一列CheckBox標識選中,加列ComBox提供候選等 。
作者: 熱卡
出處:http://www.cnblogs.com/zoexia/