public void RaiseNavigated(object page, object parameter, Prism.Navigation.NavigationMode mode) { var navigatedEventArgs = new Portable.NavigatedEventArgs() { Page = page, Parameter = parameter, NavigationMode = mode, PageType = page?.GetType(), }; RaiseNavigated(navigatedEventArgs); }
private INavigationParameters UpdateInternalParameters(INavigationParameters parameters, Prism.Navigation.NavigationMode mode) { parameters = parameters ?? new NavigationParameters(); parameters.SetNavigationMode(mode); parameters.SetSyncronizationContext(_syncContext); return(parameters); }
private async Task <INavigationResult> OrchestrateAsync( INavigationParameters parameters, Prism.Navigation.NavigationMode mode, Func <Task <bool> > navigate) { // setup default parameters CurrentParameters = parameters; parameters = UpdateInternalParameters(parameters, mode); // pre-events var old_vm = (_frame.Content as Page)?.DataContext; if (old_vm is null) { _logger.Log($"No view-model is set for source page; this is okay; skipping all the [from] overrides including CanNavigate/Async.", Category.Info, Priority.None); } else if (!await CanNavigateAsync(parameters, old_vm)) { return(this.NavigationFailure($"[From]{old_vm}.CanNavigateAsync returned false; this is okay; FrameFacade orchestration will stop here.")); } else if (!CanNavigate(parameters, old_vm)) { return(this.NavigationFailure($"[From]{old_vm}.CanNavigate returned false; this is okay; FrameFacade orchestration will stop here.")); } // navigate var success = await NavigateFrameAsync(navigate); _logger.Log($"{nameof(FrameFacade)}.{nameof(OrchestrateAsync)}.NavigateFrameAsync() returned {success}.", Category.Info, Priority.None); if (!success) { return(this.NavigationFailure("NavigateFrameAsync() returned false; this is very unusual, but possibly okay; FrameFacade orchestration will stop here.")); } if (!(_frame.Content is Page new_page)) { var message = "There is no new page in FrameFacade after NavigateFrameAsync; this is a critical failure. Check the page constructor, maybe?"; _logger.Log(message, Category.Exception, Priority.High); throw new Exception(message); } // post-events if (old_vm != null) { OnNavigatedFrom(parameters, old_vm); } var new_vm = new_page?.DataContext; if (new_vm is null) { if (Mvvm.ViewModelLocator.GetAutowireViewModel(new_page) is null) { // developer didn't set autowire, and did't set datacontext manually _logger.Log("No view-model is set for target page, we will attempt to find view-model declared using RegisterForNavigation<P, VM>().", Category.Info, Priority.None); // set the autowire & see if we can find it for them Mvvm.ViewModelLocator.SetAutowireViewModel(new_page, true); // TODO: I wonder if I need to delay for a second? new_vm = new_page.DataContext; if (new_vm != null) { _logger.Log($"View-Model: {new_vm} found for target View: {new_page}.", Category.Info, Priority.None); } } } if (new_vm is null) { _logger.Log($"View-Model for source page not found; this is okay, skipping all the [to] overides.", Category.Info, Priority.None); } else { OnNavigatingTo(parameters, new_vm); await OnNavigatedToAsync(parameters, new_vm); OnNavigatedTo(parameters, new_vm); } // refresh-bindings BindingUtilities.UpdateBindings(new_page); // finally return(this.NavigationSuccess()); }
private INavigationParameters CreateDefaultParameters(INavigationParameters parameters, Prism.Navigation.NavigationMode mode) { parameters = parameters ?? new NavigationParameters(); parameters.SetNavigationMode(mode); parameters.SetNavigationService(_navigationService); parameters.SetSyncronizationContext(_syncContext); return(parameters); }
public bool RaiseNavigatingCancels(object page, object parameter, bool suspending, Prism.Navigation.NavigationMode mode, Type targetType) { var navigatingDeferral = new Template10.Mobile.Common.DeferralManager(); var navigatingEventArgs = new Portable.NavigatingEventArgs(navigatingDeferral) { Page = page, Parameter = parameter, Suspending = suspending, NavigationMode = mode, TargetPageType = targetType, TargetPageParameter = parameter, }; RaiseNavigating(navigatingEventArgs); return(navigatingEventArgs.Cancel); }