我希望我自己的后代ObservableCollection
支持AddRange
方法。这是我目前拥有的:
public class ObservableCollectionPlus<T> : ObservableCollection<T>
{
public void InsertRange(IEnumerable<T> items)
{
this.CheckReentrancy();
foreach (var item in items) Items.Add(item);
var type = NotifyCollectionChangedAction.Reset;
var colChanged = new NotifyCollectionChangedEventArgs(type);
var countChanged = new PropertyChangedEventArgs("Count");
OnPropertyChanged(countChanged);
OnCollectionChanged(colChanged);
}
}
我对这里到底发生了什么以及为什么会引发这些事件知之甚少。这是我在对 google 和 stackoverflow 进行一些研究后组装的一个解决方案。
现在,如果我绑定我的类的一个实例然后说,在通过toLongListSelector
动态添加项目之后,绑定的滚动位置被发送到它的顶部。InsertRange
ObservableCollectionPlus
LongListSelector
如果我以这种标准方式添加项目:foreach (var item in items) collection.Add(item);
thenLongListSelector
的位置不会移动。但当然,这样我会得到不希望的 DataBinding 通知开销。
显然,我当前的解决方案有问题。我怎样才能实现InsertRange
它的行为完全一样foreach (var item in items) collection.Add(item);
,但只会触发一次 DataBinding 通知,并且不会对绑定对象的滚动位置做奇怪的事情?