21
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

C# ObservableCollection<T>で大量の要素を追加したいとき

Posted at

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を設定する。

21
21
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?