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

在WPF中合并两个ObservableCollection的更多相关文章

  1. 如何在Node.js中合并两个复杂对象

    通常情况下,在Node.js中我们可以通过underscore的extend或者lodash的merge来合并两个对象,但是对于像下面这种复杂的对象,要如何来应对呢? 例如我有以下两个object: ...

  2. SQL中合并两个表的JOIN语句

    SQL里有四种JOIN语句用于根据某条件合并两个表: (INNER) JOIN: 交集 LEFT (OUTER) JOIN: 左表数据全包括,右表对应的如果没有就是NULL RIGHT (OUTER) ...

  3. mvc 中合并两个list集合

    有时候,在进行查询操作的时候需要将从数据库中查询的两张表进行合并,成为一张表然后返回给前端.或者在原有的一张表基础上面加几个新的字段. 这个时候可以新建一个.class[model类],在这个新建的m ...

  4. WPF中实现两个窗口之间传值

    在使用WPF的时候,我们经常会用到窗体之间传值,下面示例主窗口传值到子窗口,子窗口传值到主窗口的方法. 一.主窗口向子窗口传值 主窗口向子窗口传值主要方法就是在子窗口建立一个接收主窗口值的变量,然后实 ...

  5. WPF中的两个绑定场景

    1. 如何在诸如ListBox这样的项中绑定父类数据上下文. <ListBox Grid.Row=" ItemsSource="{Binding Entries}" ...

  6. [PHP] 算法-合并两个有序链表为一个有序链表的PHP实现

    合并两个有序的链表为一个有序的链表: 类似归并排序中合并两个数组的部分 1.遍历链表1和链表2,比较链表1和2中的元素大小 2.如果链表1结点大于链表2的结点,该结点放入第三方链表 3.链表1往下走一 ...

  7. javascript合并两个数组

    在开发的过程中,我们很多时候会遇到需要将两个数组合并成一个数组的情况出现. var arr1 = [1, 2, 3]; var arr2 = [4, 5, 6]; // 将arr1和arr2合并成为[ ...

  8. wpf中在style的template寻找ControlTemplate和DataTemplate的控件

    一.WPF中的两棵树 WPF中每个控件的Template都是由ControlTemplate构成,ControlTemplate包含了构成该控件的各种子控件,这些子控件就构成了VisualTree:而 ...

  9. WPF入门(三)->两个几何图形合并(CombinedGeometry)

    原文:WPF入门(三)->两个几何图形合并(CombinedGeometry) 在WPF中,提供了一个CombinedGeometry对象可以使两个几何图形合并产生效果 CombinedGeom ...

随机推荐

  1. Android百度地图的使用

    做关于位置或者定位的app的时候免不了使用地图功能,本人最近由于项目的需求需要使用百度地图的一些功能,所以这几天研究了一下,现写一下blog记录一下,欢迎大家评论指正! 一.申请AK(API Key) ...

  2. webstorm es6 语法报错

    设置settings javascript language version后 <script>标签加个 type <script type="text/ecmascrip ...

  3. es查询与聚合

    """ 官方文档:https://www.elastic.co/guide/cn/elasticsearch/guide/current/aggregations.htm ...

  4. ios 里如何处理四舍五入的问题

    http://blog.sina.com.cn/s/blog_a2774bb10101293j.html 今天朋友问我一个问题,就是如何只舍不入.比如 float price = 0.126,怎么样才 ...

  5. mysql索引语法及示例

    注:本篇文章是对菜鸟教程中的mysql索引(http://www.runoob.com/mysql/mysql-index.html)的翻译版本:添加了示例,便于理解: 索引分单列索引和组合索引.单列 ...

  6. ES6新特性之傻瓜式说明

    ES6出来挺长一段时间了,但目前网上好像教程并不多也不详细.我依然遵循傻瓜式教学模式,白话文说明JavaScript和ES6的一些区别,说明下ES6的一些新特性.本文适合新手学习,大神请勿见笑,在下在 ...

  7. [ Mongodb ] 问题总汇

    1. Mongodb备份 [root@localhost ~]# mongodump -h /users 2. Mongodb恢复 [root@localhost ~]# mongorestore - ...

  8. Spring MVC基础篇4

    Spring MVC操作原生Servlet 对象 Spring MVC 可以操作原生的Servlet API,如下的这些原生API,可以各自 自由混合使用,也可以和其他非原生 参数组合使用 实例代码: ...

  9. Eclipse svn代码提交冲突

    Eclipse svn代码提交冲突(转) 1.Synchronize视图下查看代码冲突 1.Incoming Mode 全部update,更新到本地2.Outgoing Mode 全部commit,提 ...

  10. 前段基础HTML

    HTML介绍 Web服务本质 import socket sk = socket.socket() sk.bind(("127.0.0.1", 8080)) sk.listen(5 ...