zoukankan      html  css  js  c++  java
  • 在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);
            }
        }

  • 相关阅读:
    VirtualBox设置共享文件夹和镜像访问的方法
    虚拟机文件越来越大解决方案
    linux磁盘清理方法 Linux 下垃圾清理工具 BleachBit
    linux上怎么切换不同版本的arm-linux-gcc?只需改一行函数
    windows桌面添加右键环境
    各种机械键盘轴的差别,究竟什么轴好
    XML是什么,它能够做什么?——写给XML入门者
    MATLAB中导入数据:importdata函数
    理解ThreadLocal
    Leetcode:best_time_to_buy_and_sell_stock_II题解
  • 原文地址:https://www.cnblogs.com/TianFang/p/3572700.html
Copyright © 2011-2022 走看看