在WPF中合并两个ObservableCollection集合

 更新时间:2022年06月22日 10:40:15   作者:天方  
这篇文章介绍了在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);
        }
    }

到此这篇关于WPF合并ObservableCollection的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • C#中的静态成员、静态方法、静态类介绍

    C#中的静态成员、静态方法、静态类介绍

    本文主要介绍了C#中的静态成员、静态方法、静态类的基础的使用,并做了相关的代码演示,供初学者参考。
    2016-03-03
  • C#中实现PriorityQueue优先级队列的代码

    C#中实现PriorityQueue优先级队列的代码

    这篇文章主要介绍了C#中PriorityQueue优先级队列的实现,构造初始化这部分主要介绍关键的字段和方法,比较器的初始化以及堆的初始化,需要的朋友可以参考下
    2021-12-12
  • C#正则表达式获取下拉菜单(select)的相关属性值

    C#正则表达式获取下拉菜单(select)的相关属性值

    这篇文章主要介绍了C#正则表达式获取下拉菜单(select)的相关属性值,比如可以获得name属性的值、value值、指定值,需要的朋友可以参考下
    2014-07-07
  • c#自带缓存使用方法 c#移除清理缓存

    c#自带缓存使用方法 c#移除清理缓存

    这篇文章主要介绍了c#自带缓存使用方法,包括获取数据缓存、设置数据缓存、移除指定数据缓存等方法,需要的朋友可以参考下
    2014-02-02
  • c# 从内存中释放Selenium chromedriver.exe

    c# 从内存中释放Selenium chromedriver.exe

    这篇文章主要介绍了c# 从内存中释放Selenium chromedriver.exe的方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下
    2021-01-01
  • C#中的委托详解

    C#中的委托详解

    本文详细讲解了C#中的委托,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • 你了解C#的协变和逆变吗,看完这篇就懂了

    你了解C#的协变和逆变吗,看完这篇就懂了

    这篇文章主要介绍了你了解C#的协变和逆变吗,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • 详解C#中检查null的语法糖

    详解C#中检查null的语法糖

    这篇文章主要为大家详细介绍了C#中检查null的语法糖,文中的示例代码讲解详细,对我们学习C#有一定帮助,感兴趣的小伙伴可以了解一下
    2022-04-04
  • C#通过反射创建自定义泛型

    C#通过反射创建自定义泛型

    这篇文章主要介绍了C#通过反射创建自定义泛型的方法,需要的朋友可以参考下
    2014-08-08
  • C#文件分割的方法

    C#文件分割的方法

    这篇文章主要介绍了C#文件分割的方法,针对小于等于64M文件和大于64M文件两种情况分析了C#文件分割的实现技巧,需要的朋友可以参考下
    2015-07-07

最新评论