实施上的AddRange用的ObservableCollection数据绑定适当的支持 [英] Implement AddRange on ObservableCollection with proper support for DataBinding

查看:985
本文介绍了实施上的AddRange用的ObservableCollection数据绑定适当的支持的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想我自己的的ObservableCollection 的后裔,以支持的AddRange 方法。
这是我目前有:

I would like my own descendant of ObservableCollection to support AddRange method. Here is what I currently have:

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



我没有什么也正是要多少知识在这里,为什么这些事件引起人们的关注。这是在做对谷歌和计算器一些研究之后,我已经组建了一个solutiom。

I don't have much knowledge of what's exactly going on here and why are these events get raised. This is a solutiom that I've assembled after doing some research on google and stackoverflow.

现在,如果我结合我的类的实例说 LongListSelector 然后,通过后动态添加项目 InsertRange ObservableCollectionPlus ,一个绑定 LongListSelector 的滚动位置发送到它的上面。

Now, if I bind an instance of my class to say LongListSelector then, after dynamically adding items via InsertRange to ObservableCollectionPlus, a binded LongListSelector's scroll position is sent to it's top.

如果我添加项目本标准方式:的foreach(在项目VAR项目)collection.Add(项目); 然后 LongListSelector 的地位没有得到转变。但是,当然,这样一来我得到的数据绑定通知开销是不需要的。

If I add items in this standard way: foreach (var item in items) collection.Add(item); then LongListSelector's position does not get shifted. But of course this way I get DataBinding notifications overhead in which is undesired.

显然,事情是在我目前的解决方案做了错事。我如何能实现 InsertRange 将完全一样的foreach(VAR项项目)collection.Add(项目); 但只会火数据绑定通知一次,不会做奇怪的事情来绑定对象的滚动位置?

Apparently, something is done wrong in my current solution. How can I implement InsertRange that will behave exactly like foreach (var item in items) collection.Add(item); but will only fire DataBinding notification once and will not do strange things to binded object's scroll position?

推荐答案

这可能是因为您的发送在 NotifyCollectionChangedAction.Reset 的通知,也许只是在 NotifyCollectionChangedAction.Add 将工作,也许:)

It could be because your sending the NotifyCollectionChangedAction.Reset notification, maybe just the NotifyCollectionChangedAction.Add will work, Maybe :)

public class ObservableRangeCollection<T> : ObservableCollection<T>
{
    public void AddRange(IEnumerable<T> collection)
    {
        foreach (var i in collection)
        {
            Items.Add(i);
        }
        OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, collection.ToList()));
    }
}

这篇关于实施上的AddRange用的ObservableCollection数据绑定适当的支持的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆