一个可观察集合中的事务支持

3

我对最高效的方法来更改可观察集合很感兴趣,使得只有一个属性被更改时才会触发。比如说,我想用3个项目填充列表,没有addCollection方法或类似的方法,所以我必须进行清除+ 3次添加。我需要创建一个不同的可观察集合并进行分配吗?或者其他人使用什么技术?

1个回答

2
.NET Framework的ObservableCollection类在每个项目添加到集合时都会发送单独的通知,并且没有提供AddRange类型功能的机制。但是,您可以非常轻松地创建自己的集合,实现INotifyCollectionChanged并发送任何所需的通知。
您可能会遇到的问题是INotifyCollectionChanged接口包括指定多个项目已在单个消息中添加到集合的功能,但是没有标准NET Framework类实际上创建这些通知。因此,一些第三方和开源控件在收到添加通知时假定仅添加了一个项目。即使内置的.NET Framework类也可能存在与此相关的未发现的错误。
出于这些原因,建议您的自定义集合具有一种模式,在该模式下它可以设置为始终在AddRange结束时发送Reset通知,而不是单个的多项Add通知。您可以根据实际添加的项目数量进一步优化此过程,通过发送多个单项Add通知或Reset通知。
当然,有时候只需用新的ObservableCollection替换原来的集合同样容易。但在某些情况下,它将比循环Add()效率低得多,因为事件处理程序和CollectionView将被重新构建。如果集合很大,而您的循环每次仅添加少量项目,则有时候使用替换更加高效。但有时这种方法根本行不通。

可观察集合实现了ICollectionChanged接口,但我确定这就是你的意思。 - Aran Mulholland
谢谢Ray,你的回答非常有见地++ :) - Anders Rune Jensen
1
@Aran:感谢您的纠正。我记错了。顺便说一下,它实际上是INotifyCollectionChanged而不是ICollectionChanged(也不是我之前写的!) - Ray Burns
很不幸的是,我们必须担心在使用INotifyCollectionChanged接口的地方(例如:WPF),可能无法正确遵守该接口,以便支持修改多个项,但如果您要自己实现此接口,则我也会在这种情况下使用谨慎。我自己计划在我的实现中创建一个属性,以在更改事件中切换关闭操作分组,以便我可以有选择地在遇到问题的情况下将其关闭。 - jpierson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接