DataGrid的數(shù)據(jù)源的加載需要大量IO操作,不可能等數(shù)據(jù)全部讀取之后才顯示到UI上。由于對(duì)WPF數(shù)據(jù)綁定不很熟悉,對(duì)ObserveCollection等內(nèi)容沒(méi)有太多時(shí)間去研究,只能用一些取巧的辦法了。
設(shè)置DataGrid的數(shù)據(jù)源,只要修改ItemsSource屬性就可以了,如下:
List dataList = new List()datagrid1.ItemsSource = dataList;
但是如果沒(méi)有進(jìn)行數(shù)據(jù)綁定的話(huà),對(duì)dataList進(jìn)行Add,是不會(huì)更新的UI上的,除非點(diǎn)擊列標(biāo)題,對(duì)列進(jìn)行排序,UI線(xiàn)程對(duì)數(shù)據(jù)顯示的更新。主動(dòng)的做法是使用Refresh方法,如下:
dataGrid1.Items.Refresh();
看到有的文章說(shuō)用UpdateLayout,經(jīng)過(guò)嘗試不怎么管用。這樣就解決了UI更新的問(wèn)題。
對(duì)數(shù)據(jù)源的加載是需要另一個(gè)線(xiàn)程的,WPF里面是不允許非UI線(xiàn)程對(duì)UI線(xiàn)程中控件進(jìn)行直接的操作,這點(diǎn)好Android是一樣的,應(yīng)該都是從安全的角度考慮的。不過(guò)如果實(shí)在需要更新UI空間的話(huà),也不是無(wú)解。Android里面可以用Handler,WPF里面用的是控件的Dispatcher,需要調(diào)用的是控件Dispatcher的BeginInvoke方法。在MSDN上看到一篇文章(http://msdn.microsoft.com/en-us/library/757y83z4(v=VS.100).aspx),就講的是用BeginInvoke方法來(lái)多線(xiàn)程更新UI控件的,不過(guò)這篇文章講的是Windows Form的,和WPF的一個(gè)區(qū)別是,BeginInvoke直接就是控件的方法。BeginInvoke實(shí)際上可以看作就是在調(diào)用一個(gè)回調(diào)方法,所以就用到委托了。
下面給出一段代碼示例(WPF的):
//... //new Thread(ThreadMethod).Start(); private void ThreadMethod() { object[] param = { 1000 }; dataGrid1.Dispatcher.BeginInvoke(new updateDateGridDelegate(UpdateDateGrid), param); } private delegate void updateDateGridDelegate(int time); private void UpdateDateGrid(int time) { Thread.Sleep(time); dataGrid1.Items.Refresh(); return; }
當(dāng)然,最好還是好好研究數(shù)據(jù)綁定,由于只是作業(yè)上的一小部分,時(shí)間也很有限,所以就用這種非主流的做法。
聯(lián)系客服