DataGrid的數(shù)據(jù)源的加載需要大量IO操作,不可能等數(shù)據(jù)全部讀取之后才顯示到UI上。由于對WPF數(shù)據(jù)綁定不很熟悉,對ObserveCollection等內(nèi)容沒有太多時間去研究,只能用一些取巧的辦法了。
設(shè)置DataGrid的數(shù)據(jù)源,只要修改ItemsSource屬性就可以了,如下:
List dataList = new List()datagrid1.ItemsSource = dataList;
但是如果沒有進(jìn)行數(shù)據(jù)綁定的話,對dataList進(jìn)行Add,是不會更新的UI上的,除非點擊列標(biāo)題,對列進(jìn)行排序,UI線程對數(shù)據(jù)顯示的更新。主動的做法是使用Refresh方法,如下:
dataGrid1.Items.Refresh();
看到有的文章說用UpdateLayout,經(jīng)過嘗試不怎么管用。這樣就解決了UI更新的問題。
對數(shù)據(jù)源的加載是需要另一個線程的,WPF里面是不允許非UI線程對UI線程中控件進(jìn)行直接的操作,這點好Android是一樣的,應(yīng)該都是從安全的角度考慮的。不過如果實在需要更新UI空間的話,也不是無解。Android里面可以用Handler,WPF里面用的是控件的Dispatcher,需要調(diào)用的是控件Dispatcher的BeginInvoke方法。在MSDN上看到一篇文章(http://msdn.microsoft.com/en-us/library/757y83z4(v=VS.100).aspx),就講的是用BeginInvoke方法來多線程更新UI控件的,不過這篇文章講的是Windows Form的,和WPF的一個區(qū)別是,BeginInvoke直接就是控件的方法。BeginInvoke實際上可以看作就是在調(diào)用一個回調(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è)上的一小部分,時間也很有限,所以就用這種非主流的做法。