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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM