サービス業で働く社内SEのブログ

技術メモを適当にかいつまんで記載します

【C#】ReactivePropertyのReactiveCollectionについて

ここのところ、せこせこReactivePropertyを勉強中なのでそのメモを記載します。
※RPの詳細は当該ライブラリ管理者のかずきさんブログを参考にするのが一番です。 blog.okazuki.jp

UIコントロールにObservableCollectionをバインドしていた場合当該コレクションに対してUIスレッド以外から要素の操作をすると例外を吐きます。
が、ObservableCollectionを継承しているReactivePropertyReactiveCollectionを用いると、同じような使い方でUIスレッドで要素の操作が可能になります。
コンストラクタでUIスレッド以外も指定できそうです。

namespace DiffBetweenObservableCollectionAndReactiveCollection
{
    class MainWindowViewModel
    {
        public ReactiveCollection<string> reactiveCollection { get; private set; }
        public ObservableCollection<string> observableCollection { get; private set; }

        public MainWindowViewModel()
        {
            observableCollection = new ObservableCollection<string>();
            reactiveCollection = new ReactiveCollection<string>();
        }

        public void AddObservableCollection()
        {
            Task.Run(() =>
            {
                for (int i = 0; i < 10; i++)
                {
                    this.observableCollection.Add(i.ToString());
                }
            });
        }

        public void AddReactiveCollection()
        {
            Task.Run(() =>
            {
                for (int i = 0; i < 10; i++)
                {
                    this.reactiveCollection.AddOnScheduler(i.ToString());
                }
            });
        }

    }
}

上記のようにViewModelにバインドしているObservableCollectionにAddするとNotSupportedExceptionをはきますが、ReactiveCollectionAddOnSchedulerを使用すれば楽にUIスレッド以外から要素の追加ができました。
Githubにも上げました。

github.com