LivetではUIDispatcherを明示的に設定しないとnull例外が出る


WPFのMVVMアプリを作ろうとLivetを使っていた時に発生したNullReferenceExceptionについて原因が分かったので, 備忘録的メモ.

Livet

Livetは国産のMVVMインフラストラクチャです.
MVVMパターンに必要な機能が一通り揃っていて, いつもお世話になっています.

ReadonlyDispatcherCollection

LivetにはObservableCollection(Modelの配列)からViewModel用の配列を作るための便利なヘルパ関数が用意されています.
CreateReadonlyDispatcherCollectionですね.

MyApplicationViewModel.cs
VMList = ViewModelHelper.CreateReadOnlyDispatcherCollection(
            Model.List,
            (m) => new VM(m),
            DispatcherHelper.UIDispatcher);
            CompositeDisposable.Add(VMList);

これでModel.Listの変更が自動的にVMListに反映されると期待して, 変更を加えてみると...

なんかnull例外出てるんすけど...orz

原因と対処法

Livet.DispatcherHelper.UIDispatcherがnullで死んでました.

対処法ですが, App.xaml.csのOnStartUpにて, Livet.DispatcherHelper.UIDispatcherにAppのDispatcherを入れてあげればOKです.

App.xaml.cs
    /// <summary>
    /// App.xaml の相互作用ロジック
    /// </summary>
    public partial class App : Application
    {
        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);
            // ↓が必要!
            Livet.DispatcherHelper.UIDispatcher = Dispatcher;
        }
    }

既存のアプリ作成に途中参加すると, この辺りはすでに先輩がやってくれていて, 自前でやろうとしたときにちょっとハマりました.

LivetのVSプロジェクトテンプレートでプロジェクト作成すればこんな事は起こらないんですが, NuGetで後からLivetパッケージを入れた場合などにハマりやすいポイントかと思います.