From 7f5b677cc30404d23cee093e1f9f6e2d39a39145 Mon Sep 17 00:00:00 2001 From: Robert Date: Thu, 11 Dec 2025 23:58:15 +0100 Subject: [PATCH] Capture view model references in WhenActivated of views to avoid NRE --- src/Artemis.UI/Screens/Debugger/DebugView.axaml.cs | 13 ++++++++----- .../Plugins/PluginSettingsWindowView.axaml.cs | 7 ++----- .../Panels/VisualEditor/VisualEditorView.axaml.cs | 6 +++--- src/Artemis.UI/Screens/Root/SplashView.axaml.cs | 3 ++- .../Screens/VisualScripting/NodeScriptView.axaml.cs | 11 ++++++----- 5 files changed, 21 insertions(+), 19 deletions(-) diff --git a/src/Artemis.UI/Screens/Debugger/DebugView.axaml.cs b/src/Artemis.UI/Screens/Debugger/DebugView.axaml.cs index 6b7f58b7f..01ed1a181 100644 --- a/src/Artemis.UI/Screens/Debugger/DebugView.axaml.cs +++ b/src/Artemis.UI/Screens/Debugger/DebugView.axaml.cs @@ -21,11 +21,14 @@ public partial class DebugView : ReactiveAppWindow this.WhenActivated(d => { - Observable.FromEventPattern(x => ViewModel!.ActivationRequested += x, x => ViewModel!.ActivationRequested -= x).Subscribe(_ => - { - WindowState = WindowState.Normal; - Activate(); - }).DisposeWith(d); + DebugViewModel vm = ViewModel!; + Observable.FromEventPattern(x => vm.ActivationRequested += x, x => vm.ActivationRequested -= x) + .Subscribe(_ => + { + WindowState = WindowState.Normal; + Activate(); + }) + .DisposeWith(d); }); } diff --git a/src/Artemis.UI/Screens/Plugins/PluginSettingsWindowView.axaml.cs b/src/Artemis.UI/Screens/Plugins/PluginSettingsWindowView.axaml.cs index 41920c857..9c027031b 100644 --- a/src/Artemis.UI/Screens/Plugins/PluginSettingsWindowView.axaml.cs +++ b/src/Artemis.UI/Screens/Plugins/PluginSettingsWindowView.axaml.cs @@ -19,14 +19,11 @@ public partial class PluginSettingsWindowView : ReactiveAppWindow { - Observable.FromEventPattern( - x => ViewModel!.ConfigurationViewModel.CloseRequested += x, - x => ViewModel!.ConfigurationViewModel.CloseRequested -= x - ) + PluginSettingsWindowViewModel vm = ViewModel!; + Observable.FromEventPattern(x => vm.ConfigurationViewModel.CloseRequested += x, x => vm.ConfigurationViewModel.CloseRequested -= x) .Subscribe(_ => Close()) .DisposeWith(disposables); } ); } - } \ No newline at end of file diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/VisualEditor/VisualEditorView.axaml.cs b/src/Artemis.UI/Screens/ProfileEditor/Panels/VisualEditor/VisualEditorView.axaml.cs index 648c815ab..5c613747c 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/Panels/VisualEditor/VisualEditorView.axaml.cs +++ b/src/Artemis.UI/Screens/ProfileEditor/Panels/VisualEditor/VisualEditorView.axaml.cs @@ -27,9 +27,9 @@ public partial class VisualEditorView : ReactiveUserControl { - VisualEditorViewModel? viewModel = ViewModel; - viewModel!.AutoFitRequested += ViewModelOnAutoFitRequested; - Disposable.Create(() => viewModel.AutoFitRequested -= ViewModelOnAutoFitRequested).DisposeWith(d); + VisualEditorViewModel vm = ViewModel!; + vm!.AutoFitRequested += ViewModelOnAutoFitRequested; + Disposable.Create(() => vm.AutoFitRequested -= ViewModelOnAutoFitRequested).DisposeWith(d); }); this.WhenAnyValue(v => v.Bounds).Where(_ => !_movedByUser).Subscribe(_ => AutoFit(true)); diff --git a/src/Artemis.UI/Screens/Root/SplashView.axaml.cs b/src/Artemis.UI/Screens/Root/SplashView.axaml.cs index cc54a133c..082586d98 100644 --- a/src/Artemis.UI/Screens/Root/SplashView.axaml.cs +++ b/src/Artemis.UI/Screens/Root/SplashView.axaml.cs @@ -19,7 +19,8 @@ public partial class SplashView : ReactiveWindow #endif 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)) .DisposeWith(disposables); }); diff --git a/src/Artemis.UI/Screens/VisualScripting/NodeScriptView.axaml.cs b/src/Artemis.UI/Screens/VisualScripting/NodeScriptView.axaml.cs index eed8b7c31..0ebcc26f3 100644 --- a/src/Artemis.UI/Screens/VisualScripting/NodeScriptView.axaml.cs +++ b/src/Artemis.UI/Screens/VisualScripting/NodeScriptView.axaml.cs @@ -33,16 +33,17 @@ public partial class NodeScriptView : ReactiveUserControl this.WhenActivated(d => { - ViewModel!.AutoFitRequested += ViewModelOnAutoFitRequested; - ViewModel.PickerPositionSubject.Subscribe(ShowPickerAt).DisposeWith(d); - if (ViewModel.IsPreview) + NodeScriptViewModel vm = ViewModel!; + vm.AutoFitRequested += ViewModelOnAutoFitRequested; + vm.PickerPositionSubject.Subscribe(ShowPickerAt).DisposeWith(d); + if (vm.IsPreview) { 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); - Disposable.Create(() => ViewModel.AutoFitRequested -= ViewModelOnAutoFitRequested).DisposeWith(d); + Disposable.Create(() => vm.AutoFitRequested -= ViewModelOnAutoFitRequested).DisposeWith(d); }); }