1+ using Microsoft . Extensions . DependencyInjection ;
2+ using PCL2 . Neo . ViewModels ;
3+ using System ;
4+ using System . Reflection ;
5+
6+ namespace PCL2 . Neo . Services ;
7+
8+ public class NavigationService
9+ {
10+ public IServiceProvider ServiceProvider { get ; init ; }
11+
12+ public event Action < ViewModelBase ? > ? CurrentViewModelChanged ;
13+ public event Action < ViewModelBase ? > ? CurrentSubViewModelChanged ;
14+
15+ private ViewModelBase ? _currentViewModel ;
16+ public ViewModelBase ? CurrentViewModel
17+ {
18+ get => _currentViewModel ;
19+ protected set
20+ {
21+ if ( value == _currentViewModel )
22+ return ;
23+ _currentViewModel = value ;
24+ CurrentViewModelChanged ? . Invoke ( value ) ;
25+ }
26+ }
27+
28+ private ViewModelBase ? _currentSubViewModel ;
29+ public ViewModelBase ? CurrentSubViewModel
30+ {
31+ get => _currentSubViewModel ;
32+ protected set
33+ {
34+ if ( value == _currentSubViewModel )
35+ return ;
36+ _currentSubViewModel = value ;
37+ CurrentSubViewModelChanged ? . Invoke ( value ) ;
38+ }
39+ }
40+
41+ public NavigationService ( IServiceProvider serviceProvider )
42+ {
43+ ServiceProvider = serviceProvider ;
44+ }
45+
46+ public virtual T Goto < T > ( ) where T : ViewModelBase
47+ {
48+ if ( typeof ( T ) . GetCustomAttribute < DefaultSubViewModelAttribute > ( ) is { } dsvm )
49+ {
50+ var vm = CurrentViewModel as T ;
51+ if ( vm ? . GetType ( ) != typeof ( T ) )
52+ {
53+ vm = ServiceProvider . GetRequiredService < T > ( ) ;
54+ CurrentViewModel = vm ;
55+ }
56+ if ( CurrentSubViewModel ? . GetType ( ) != dsvm . SubViewModel )
57+ CurrentSubViewModel = ServiceProvider . GetRequiredService ( dsvm . SubViewModel ) as ViewModelBase ;
58+ return vm ;
59+ }
60+
61+ if ( typeof ( T ) . GetCustomAttribute < SubViewModelOfAttribute > ( ) is { } svmo )
62+ {
63+ var subVm = CurrentSubViewModel as T ;
64+ if ( CurrentViewModel ? . GetType ( ) != svmo . ParentViewModel )
65+ CurrentViewModel = ServiceProvider . GetRequiredService ( svmo . ParentViewModel ) as ViewModelBase ;
66+ if ( subVm ? . GetType ( ) != typeof ( T ) )
67+ {
68+ subVm = ServiceProvider . GetRequiredService < T > ( ) ;
69+ CurrentSubViewModel = subVm ;
70+ }
71+ return subVm ;
72+ }
73+
74+ var targetVm = CurrentViewModel ? . GetType ( ) != typeof ( T ) || CurrentSubViewModel ? . GetType ( ) != typeof ( T )
75+ ? ServiceProvider . GetRequiredService < T > ( )
76+ : ( T ) CurrentViewModel ;
77+ if ( CurrentViewModel ? . GetType ( ) != typeof ( T ) )
78+ CurrentViewModel = targetVm ;
79+ if ( CurrentSubViewModel ? . GetType ( ) != typeof ( T ) )
80+ CurrentSubViewModel = targetVm ;
81+ return targetVm ;
82+ }
83+ }
0 commit comments