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的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持。
声明:如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。