在WPF中合並兩個ObservableCollection集合
WPF中的ObservableCollection是一個非常常用的集合對象,我們可以通過將它綁定到ListBox之類的集合控件上時,當集合發生變更時,會同步更新到界面上。但是,有的時候我們需要合並兩個集合,將他們的拼接後顯示在界面上,此時該何如做呢?
乍一看來,這是個非常簡單的事情,.Net的BCL本身就提供瞭IEnumerate集合連接函數——Concat,可以通過它輕松連接兩個集合。但當你使用它連接集合並果呈現到界面上時,就會發現一個問題——雖然它可以將當前結果拼接起來顯示,但卻不會同步顯示集合的變更。
原因非常簡單:界面之所以能同步ObservableCollection的結果,是因為它實現瞭INotifyCollectionChanged接口。而用Concat連接後的新集合卻是沒有實現這個接口的。雖然自己實現一個這樣的合並後的可通知集合並不難,但.Net中本身就已經提供瞭這樣一個集合——CompositeCollection,這裡就不重復造輪子瞭。代碼示例如下:
void testCompositeCollection() { var cmpc = new CompositeCollection(); var numbers = new ObservableCollection<int>(); var lines = new ObservableCollection<string>(); cmpc.Add(new CollectionContainer() { Collection = numbers }); cmpc.Add(new CollectionContainer() { Collection = lines }); listBox.ItemsSource = cmpc; foo(numbers); foo(lines); } async void foo(ObservableCollection<string> lines) { for (int i = 0; i < 10; i++) { await Task.Delay(800); lines.Add("Line " + 2 * i); } } async void foo(ObservableCollection<int> numbers) { for (int i = 0; i < 10; i++) { await Task.Delay(1000); numbers.Add(i); } }
到此這篇關於WPF合並ObservableCollection的文章就介紹到這瞭。希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。
推薦閱讀:
- C#中async和await的深入分析
- C#異步方法返回void與Task的區別詳解
- C#中的Task.Delay()和Thread.Sleep()區別(代碼案例)
- C#使用Task實現異步方法
- .NET實現異步編程async和await