Livet에서는 UIDispatcher를 명시적으로 설정하지 않으면 null 예외가 나온다

3225 단어 MVVMLivetC#WPF
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를 넣으면 괜찮습니다.

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 패키지를 넣은 경우에 빠지기 쉬운 포인트라고 생각합니다.

좋은 웹페이지 즐겨찾기