在WPF中合并兩個ObservableCollection集合
WPF中的ObservableCollection是一個非常常用的集合對象,我們可以通過將它綁定到ListBox之類的集合控件上時,當(dāng)集合發(fā)生變更時,會同步更新到界面上。但是,有的時候我們需要合并兩個集合,將他們的拼接后顯示在界面上,此時該何如做呢?
乍一看來,這是個非常簡單的事情,.Net的BCL本身就提供了IEnumerate集合連接函數(shù)——Concat,可以通過它輕松連接兩個集合。但當(dāng)你使用它連接集合并果呈現(xiàn)到界面上時,就會發(fā)現(xiàn)一個問題——雖然它可以將當(dāng)前結(jié)果拼接起來顯示,但卻不會同步顯示集合的變更。
原因非常簡單:界面之所以能同步ObservableCollection的結(jié)果,是因?yàn)樗鼘?shí)現(xiàn)了INotifyCollectionChanged接口。而用Concat連接后的新集合卻是沒有實(shí)現(xiàn)這個接口的。雖然自己實(shí)現(xiàn)一個這樣的合并后的可通知集合并不難,但.Net中本身就已經(jīng)提供了這樣一個集合——CompositeCollection,這里就不重復(fù)造輪子了。代碼示例如下:
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);
}
}到此這篇關(guān)于WPF合并ObservableCollection的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C#函數(shù)式編程中的標(biāo)準(zhǔn)高階函數(shù)詳解
這篇文章主要介紹了C#函數(shù)式編程中的標(biāo)準(zhǔn)高階函數(shù)詳解,本文講解了何為高階函數(shù)、Map、 Filter、Fold等內(nèi)容,需要的朋友可以參考下2015-01-01
C#實(shí)現(xiàn)裝箱與拆箱操作簡單實(shí)例
這篇文章主要介紹了C#實(shí)現(xiàn)裝箱與拆箱操作,對于新手理解裝箱與拆箱有一定的幫助,需要的朋友可以參考下2014-07-07
Unity shader實(shí)現(xiàn)多光源漫反射以及陰影
這篇文章主要為大家詳細(xì)介紹了shader實(shí)現(xiàn)多光源漫反射以及陰影,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-07-07

