ObservableCollectionに大量の要素を追加したいとき
AddRangeみたいな一気に要素を追加するメソッドがないので、基本的には以下のように一個づつ要素を追加してあげる必要がある。
ObservableCollection.cs
foreach (var item in items)
{
// Collection = ObservableCollectionのインスタンス
Collection.Add(item);
}
要素を追加するごとに、NotifyCollectionChangedイベントが発火するので
そのたびUIが更新されて、固まってしまう。
そこで以下のように、ObservableCollectionを継承してAddRangeのようなメソッドを作成する。
ObservableCollectionEX.cs
public class ObservableCollectionEX<T> : ObservableCollection<T>
{
public void AddRange(IEnumerable<T> addItems)
{
if (addItems == null)
{
throw new ArgumentNullException(nameof(addItems));
}
foreach (var item in addItems)
{
Items.Add(item);
}
OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
}
}
こうすることで、大量の要素が追加された後に一回だけ、NotifyCollectionChangedイベントが発火するので
比較的、UIが固まることなく更新される。
NotifyCollectionChangedEventArgsの引数は、以下を参考にNotifyCollectionChangedAction.Resetを設定する。