1
0
mirror of https://github.com/Artemis-RGB/Artemis synced 2025-12-12 21:38:38 +00:00

Capture view model references in WhenActivated of views to avoid NRE

This commit is contained in:
Robert 2025-12-11 23:58:15 +01:00
parent 5609065974
commit 7f5b677cc3
5 changed files with 21 additions and 19 deletions

View File

@ -21,11 +21,14 @@ public partial class DebugView : ReactiveAppWindow<DebugViewModel>
this.WhenActivated(d => this.WhenActivated(d =>
{ {
Observable.FromEventPattern(x => ViewModel!.ActivationRequested += x, x => ViewModel!.ActivationRequested -= x).Subscribe(_ => DebugViewModel vm = ViewModel!;
Observable.FromEventPattern(x => vm.ActivationRequested += x, x => vm.ActivationRequested -= x)
.Subscribe(_ =>
{ {
WindowState = WindowState.Normal; WindowState = WindowState.Normal;
Activate(); Activate();
}).DisposeWith(d); })
.DisposeWith(d);
}); });
} }

View File

@ -19,14 +19,11 @@ public partial class PluginSettingsWindowView : ReactiveAppWindow<PluginSettings
this.WhenActivated(disposables => this.WhenActivated(disposables =>
{ {
Observable.FromEventPattern( PluginSettingsWindowViewModel vm = ViewModel!;
x => ViewModel!.ConfigurationViewModel.CloseRequested += x, Observable.FromEventPattern(x => vm.ConfigurationViewModel.CloseRequested += x, x => vm.ConfigurationViewModel.CloseRequested -= x)
x => ViewModel!.ConfigurationViewModel.CloseRequested -= x
)
.Subscribe(_ => Close()) .Subscribe(_ => Close())
.DisposeWith(disposables); .DisposeWith(disposables);
} }
); );
} }
} }

View File

@ -27,9 +27,9 @@ public partial class VisualEditorView : ReactiveUserControl<VisualEditorViewMode
this.WhenActivated(d => this.WhenActivated(d =>
{ {
VisualEditorViewModel? viewModel = ViewModel; VisualEditorViewModel vm = ViewModel!;
viewModel!.AutoFitRequested += ViewModelOnAutoFitRequested; vm!.AutoFitRequested += ViewModelOnAutoFitRequested;
Disposable.Create(() => viewModel.AutoFitRequested -= ViewModelOnAutoFitRequested).DisposeWith(d); Disposable.Create(() => vm.AutoFitRequested -= ViewModelOnAutoFitRequested).DisposeWith(d);
}); });
this.WhenAnyValue(v => v.Bounds).Where(_ => !_movedByUser).Subscribe(_ => AutoFit(true)); this.WhenAnyValue(v => v.Bounds).Where(_ => !_movedByUser).Subscribe(_ => AutoFit(true));

View File

@ -19,7 +19,8 @@ public partial class SplashView : ReactiveWindow<SplashViewModel>
#endif #endif
this.WhenActivated(disposables => this.WhenActivated(disposables =>
{ {
Observable.FromEventPattern(x => ViewModel!.CoreService.Initialized += x, x => ViewModel!.CoreService.Initialized -= x) SplashViewModel vm = ViewModel!;
Observable.FromEventPattern(x => vm.CoreService.Initialized += x, x => vm.CoreService.Initialized -= x)
.Subscribe(_ => Dispatcher.UIThread.Post(Close)) .Subscribe(_ => Dispatcher.UIThread.Post(Close))
.DisposeWith(disposables); .DisposeWith(disposables);
}); });

View File

@ -33,16 +33,17 @@ public partial class NodeScriptView : ReactiveUserControl<NodeScriptViewModel>
this.WhenActivated(d => this.WhenActivated(d =>
{ {
ViewModel!.AutoFitRequested += ViewModelOnAutoFitRequested; NodeScriptViewModel vm = ViewModel!;
ViewModel.PickerPositionSubject.Subscribe(ShowPickerAt).DisposeWith(d); vm.AutoFitRequested += ViewModelOnAutoFitRequested;
if (ViewModel.IsPreview) vm.PickerPositionSubject.Subscribe(ShowPickerAt).DisposeWith(d);
if (vm.IsPreview)
{ {
BoundsProperty.Changed.Subscribe(BoundsPropertyChanged).DisposeWith(d); BoundsProperty.Changed.Subscribe(BoundsPropertyChanged).DisposeWith(d);
ViewModel.NodeViewModels.ToObservableChangeSet().Subscribe(_ => AutoFitIfPreview()).DisposeWith(d); vm.NodeViewModels.ToObservableChangeSet().Subscribe(_ => AutoFitIfPreview()).DisposeWith(d);
} }
Dispatcher.UIThread.InvokeAsync(() => AutoFit(true), DispatcherPriority.ContextIdle); Dispatcher.UIThread.InvokeAsync(() => AutoFit(true), DispatcherPriority.ContextIdle);
Disposable.Create(() => ViewModel.AutoFitRequested -= ViewModelOnAutoFitRequested).DisposeWith(d); Disposable.Create(() => vm.AutoFitRequested -= ViewModelOnAutoFitRequested).DisposeWith(d);
}); });
} }