LoginSignup
1
4

More than 5 years have passed since last update.

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

Posted at

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.png

なんか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パッケージを入れた場合などにハマりやすいポイントかと思います.

1
4
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
1
4