天天看點

在WPF中合并兩個ObservableCollection

原文:

在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 });

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);

        }

void foo(ObservableCollection<int> numbers)

Task.Delay(1000);

            numbers.Add(i);