WPFのMVVMアプリを作ろうとLivetを使っていた時に発生したNullReferenceExceptionについて原因が分かったので, 備忘録的メモ.
Livet
Livetは国産のMVVMインフラストラクチャです.
MVVMパターンに必要な機能が一通り揃っていて, いつもお世話になっています.
ReadonlyDispatcherCollection
LivetにはObservableCollection(Modelの配列)からViewModel用の配列を作るための便利なヘルパ関数が用意されています.
CreateReadonlyDispatcherCollectionですね.
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です.
/// <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パッケージを入れた場合などにハマりやすいポイントかと思います.