自分の子孫にメソッド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);
}
}
私はここで何が起こっているのか、そしてなぜこれらのイベントが発生するのかについてはあまり知りません。これは、グーグルとスタックオーバーフローについていくつかの調査を行った後に私が組み立てた解決策です。
ここで、クラスのインスタンスをバインドして、をLongListSelector
介しInsertRange
てアイテムを動的に追加した後、バインドされたのスクロール位置がその一番上に送信されます。ObservableCollectionPlus
LongListSelector
この標準的な方法でアイテムを追加すると、foreach (var item in items) collection.Add(item);
のLongListSelector
位置はシフトされません。しかしもちろん、この方法では、望ましくないDataBinding通知のオーバーヘッドが発生します。
どうやら、私の現在のソリューションで何かが間違っています。InsertRange
まったく同じように動作するがforeach (var item in items) collection.Add(item);
、DataBinding通知を1回だけ起動し、バインドされたオブジェクトのスクロール位置に奇妙なことをしないように実装するにはどうすればよいですか?