@@ -63,23 +63,30 @@ public static IDisposable WhenActivated(this IViewFor This, Func<IEnumerable<IDi
6363
6464 var activationEvents = activationFetcher . GetActivationForView ( This ) ;
6565
66- var viewForDisp = new SerialDisposable ( ) ;
67- var currentDisp = new SerialDisposable ( ) ;
66+ var viewDisposable = new SerialDisposable ( ) ;
6867
69- var currentVmOrNull = Observable . CombineLatest ( This . WhenAnyValue ( x => x . ViewModel ) , activationEvents . Item1 , ( vm , _ ) => vm )
70- . Where ( vm => vm is ISupportsActivation ) ;
68+ return new CompositeDisposable (
69+ activationEvents . Item1 . Subscribe ( _ => viewDisposable . Disposable = new CompositeDisposable ( block ( ) ) ) ,
70+ activationEvents . Item2 . Subscribe ( _ => viewDisposable . Disposable = Disposable . Empty ) ,
71+ handleViewModelActivation ( This , activationEvents ) ,
72+ viewDisposable ) ;
73+ }
74+
75+ static IDisposable handleViewModelActivation ( IViewFor view , Tuple < IObservable < Unit > , IObservable < Unit > > activation )
76+ {
77+ var vm = view . ViewModel as ISupportsActivation ;
78+ var disp = new SerialDisposable ( ) { Disposable = ( vm != null ? vm . Activator . Activate ( ) : Disposable . Empty ) } ;
7179
72- var currentVmUnsubscribedOnDispose = Observable . Merge (
73- activationEvents . Item1 . Select ( _ => currentVmOrNull ) ,
74- activationEvents . Item2 . Select ( _ => Observable . Never < object > ( ) ) )
75- . Switch ( ) ;
80+ var latestVm = Observable . Merge (
81+ activation . Item1 . Select ( _ => view . WhenAnyValue ( x => x . ViewModel ) ) ,
82+ activation . Item2 . Select ( _ => Observable . Never < object > ( ) . StartWith ( default ( object ) ) ) )
83+ . Switch ( )
84+ . Select ( x => x as ISupportsActivation ) ;
7685
7786 return new CompositeDisposable (
78- currentVmUnsubscribedOnDispose
79- . Subscribe ( vm => viewForDisp . Disposable = ( ( ISupportsActivation ) vm ) . Activator . Activate ( ) ) ,
80- activationEvents . Item1 . Subscribe ( _ => currentDisp . Disposable = new CompositeDisposable ( block ( ) ) ) ,
81- activationEvents . Item2 . Subscribe ( _ => currentDisp . Disposable = viewForDisp . Disposable = Disposable . Empty ) ,
82- currentDisp , viewForDisp ) ;
87+ disp ,
88+ latestVm . Subscribe ( x => disp . Disposable =
89+ ( x != null ? x . Activator . Activate ( ) : Disposable . Empty ) ) ) ;
8390 }
8491
8592 public static IDisposable WhenActivated ( this IViewFor This , Action < Action < IDisposable > > block )
0 commit comments