LivetではUIDispatcherを明示的に設定しないとnull例外が出る
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パッケージを入れた場合などにハマりやすいポイントかと思います.
Author And Source
この問題について(LivetではUIDispatcherを明示的に設定しないとnull例外が出る), 我々は、より多くの情報をここで見つけました https://qiita.com/nossey/items/4764da9f0aea26a12e21著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .