日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無(wú)先后,達(dá)者為師

網(wǎng)站首頁(yè) 編程語(yǔ)言 正文

在WPF中合并兩個(gè)ObservableCollection集合_C#教程

作者:天方 ? 更新時(shí)間: 2022-08-14 編程語(yǔ)言

WPF中的ObservableCollection是一個(gè)非常常用的集合對(duì)象,我們可以通過(guò)將它綁定到ListBox之類(lèi)的集合控件上時(shí),當(dāng)集合發(fā)生變更時(shí),會(huì)同步更新到界面上。但是,有的時(shí)候我們需要合并兩個(gè)集合,將他們的拼接后顯示在界面上,此時(shí)該何如做呢?

乍一看來(lái),這是個(gè)非常簡(jiǎn)單的事情,.Net的BCL本身就提供了IEnumerate集合連接函數(shù)——Concat,可以通過(guò)它輕松連接兩個(gè)集合。但當(dāng)你使用它連接集合并果呈現(xiàn)到界面上時(shí),就會(huì)發(fā)現(xiàn)一個(gè)問(wèn)題——雖然它可以將當(dāng)前結(jié)果拼接起來(lái)顯示,但卻不會(huì)同步顯示集合的變更。

原因非常簡(jiǎn)單:界面之所以能同步ObservableCollection的結(jié)果,是因?yàn)樗鼘?shí)現(xiàn)了INotifyCollectionChanged接口。而用Concat連接后的新集合卻是沒(méi)有實(shí)現(xiàn)這個(gè)接口的。雖然自己實(shí)現(xiàn)一個(gè)這樣的合并后的可通知集合并不難,但.Net中本身就已經(jīng)提供了這樣一個(gè)集合——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);
        }
    }

原文鏈接:https://www.cnblogs.com/TianFang/p/3572700.html

欄目分類(lèi)
最近更新