public virtual async Task <TResult> Navigate <TParameter, TResult>(IMvxViewModel <TParameter, TResult> viewModel, TParameter param, IMvxBundle presentationBundle = null) where TParameter : class where TResult : class { RunViewModelLifecycle(viewModel); var request = new MvxViewModelInstanceRequest(viewModel) { PresentationValues = presentationBundle?.SafeGetData() }; var args = new NavigateEventArgs(viewModel); OnBeforeNavigate(this, args); var tcs = new TaskCompletionSource <TResult>(); viewModel.SetClose(tcs); ViewDispatcher.ShowViewModel(request); await viewModel.Initialize(param); OnAfterNavigate(this, args); try { return(await tcs.Task); } catch { return(default(TResult)); } }
protected void RunViewModelLifecycle <TParameter>( IMvxViewModel <TParameter> viewModel, TParameter param, IMvxBundle?parameterValues, IMvxBundle?savedState, IMvxNavigateEventArgs?navigationArgs) where TParameter : notnull { if (viewModel == null) { throw new ArgumentNullException(nameof(viewModel)); } try { CallCustomInitMethods(viewModel, parameterValues); if (navigationArgs?.Cancel == true) { return; } if (savedState != null) { CallReloadStateMethods(viewModel, savedState); if (navigationArgs?.Cancel == true) { return; } } viewModel.Start(); if (navigationArgs?.Cancel == true) { return; } viewModel.Prepare(); if (navigationArgs?.Cancel == true) { return; } viewModel.Prepare(param); if (navigationArgs?.Cancel == true) { return; } viewModel.InitializeTask = MvxNotifyTask.Create(() => viewModel.Initialize()); } catch (Exception exception) { throw exception.MvxWrap("Problem running viewModel lifecycle of type {0}", viewModel.GetType().Name); } }
public virtual async Task Navigate <TParameter>(IMvxViewModel <TParameter> viewModel, TParameter param, IMvxBundle presentationBundle = null) where TParameter : class { RunViewModelLifecycle(viewModel); var request = new MvxViewModelInstanceRequest(viewModel) { PresentationValues = presentationBundle?.SafeGetData() }; var args = new NavigateEventArgs(viewModel); OnBeforeNavigate(this, args); ViewDispatcher.ShowViewModel(request); await viewModel.Initialize(param); OnAfterNavigate(this, args); }
public virtual async Task <TResult> Navigate <TParameter, TResult> (MvxViewModelRequest request, IMvxViewModel viewModel, TParameter param, IMvxBundle presentationBundle = null, CancellationToken cancellationToken = default(CancellationToken)) where TParameter : class where TResult : class { var args = new NavigateEventArgs(viewModel); OnBeforeNavigate(this, args); var tcs = new TaskCompletionSource <TResult>(); if (viewModel is IMvxViewModel <TParameter, TResult> vmParamResult) { vmParamResult.SetClose(tcs, cancellationToken); await vmParamResult.Initialize(param); } else if (viewModel is IMvxViewModelResult <TResult> vmResult) { vmResult.SetClose(tcs, cancellationToken); } else if (viewModel is IMvxViewModel <TParameter> vmParam) { await vmParam.Initialize(param); } await viewModel.Initialize(); RunViewModelLifecycle(viewModel, new MvxBundle(request.ParameterValues)); ViewDispatcher.ShowViewModel(request); OnAfterNavigate(this, args); if (viewModel is IMvxViewModel <TParameter, TResult> || viewModel is IMvxViewModelResult <TResult> ) { try { return(await tcs.Task); } catch (Exception e) { return(default(TResult)); } } else { return(default(TResult)); } }
protected void RunViewModelLifecycle(IMvxViewModel viewModel, IMvxBundle parameterValues, IMvxBundle savedState) { try { CallCustomInitMethods(viewModel, parameterValues); if (savedState != null) { CallReloadStateMethods(viewModel, savedState); } viewModel.Start(); viewModel.Prepare(); viewModel.InitializeTask = MvxNotifyTask.Create(() => viewModel.Initialize()); } catch (Exception exception) { throw exception.MvxWrap("Problem running viewModel lifecycle of type {0}", viewModel.GetType().Name); } }