title: Implement AddRange on ObservableCollection with proper support for DataBinding
body: <p>I would like my own descendant of <code>ObservableCollection</code> to support <code>AddRange</code> method.
  Here is what I currently have:</p>
  
  <pre><code>public class ObservableCollectionPlus&lt;T&gt; : ObservableCollection&lt;T&gt;
  {
      public void InsertRange(IEnumerable&lt;T&gt; 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);
      }
  }
  </code></pre>
  
  <p>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. </p>
  
  <p>Now, if I bind an instance of my class to say <code>LongListSelector</code> then, after dynamically adding items via <code>InsertRange</code> to <code>ObservableCollectionPlus</code>, a binded <code>LongListSelector</code>'s scroll position is sent to it's top. </p>
  
  <p>If I add items in this standard way: <code>foreach (var item in items) collection.Add(item);</code> then <code>LongListSelector</code>'s position does not get shifted. But of course this way I get DataBinding notifications overhead in which is undesired.</p>
  
  <p>Apparently, something is done wrong in my current solution. How can I implement <code>InsertRange</code> that will behave exactly like <code>foreach (var item in items) collection.Add(item);</code> but will only fire DataBinding notification once and will not do strange things to binded object's scroll position?</p>