1
0
mirror of https://github.com/Artemis-RGB/Artemis synced 2025-12-12 13:28:33 +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 =>
{
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);
});
}

View File

@ -19,14 +19,11 @@ public partial class PluginSettingsWindowView : ReactiveAppWindow<PluginSettings
this.WhenActivated(disposables =>
{
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);
}
);
}
}

View File

@ -27,9 +27,9 @@ public partial class VisualEditorView : ReactiveUserControl<VisualEditorViewMode
this.WhenActivated(d =>
{
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));

View File

@ -19,7 +19,8 @@ public partial class SplashView : ReactiveWindow<SplashViewModel>
#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);
});

View File

@ -33,16 +33,17 @@ public partial class NodeScriptView : ReactiveUserControl<NodeScriptViewModel>
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);
});
}