private INavigationParameters CreateDefaultParameters(INavigationParameters parameters, Prism.Navigation.NavigationMode mode) { parameters = parameters ?? new NavigationParameters(); parameters.SetNavigationMode(mode); parameters.SetNavigationService(_navigationService); parameters.SetSyncronizationContext(_syncContext); return(parameters); }
private async Task <INavigationResult> OrchestrateAsync( INavigationParameters parameters, Prism.Navigation.NavigationMode mode, Func <Task <bool> > navigate) { // setup default parameters parameters = CreateDefaultParameters(parameters, mode); // pre-events var old_vm = (_frame.Content as Page)?.DataContext; if (old_vm == null) { Debug.WriteLine($"[From]View-Model is null."); } else if (!await CanNavigateAsync(parameters, old_vm)) { return(this.Failure($"[From]{old_vm}.CanNavigateAsync returned false.")); } else if (!CanNavigate(parameters, old_vm)) { return(this.Failure($"[From]{old_vm}.CanNavigate returned false.")); } // navigate var success = await NavigateFrameAsync(navigate); Debug.WriteLine($"{nameof(FrameFacade)}.{nameof(OrchestrateAsync)}.NavigateFrameAsync() returned {success}."); if (!success) { return(this.Failure("NavigateFrameAsync() returned false.")); } var new_page = _frame.Content as Page; if (new_page == null) { throw new Exception("There is no new page in Frame after Navigate."); } // post-events if (old_vm != null) { OnNavigatedFrom(parameters, old_vm); } var new_vm = new_page?.DataContext; if (new_vm == null) { if (Mvvm.ViewModelLocator.GetAutowireViewModel(new_page) == null) { // developer didn't set autowire, and did't set datacontext manually // 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) { Debug.WriteLine($"[To]View-Model is null."); } else { await OnNavigatedToAsync(parameters, new_vm); OnNavigatingTo(parameters, new_vm); OnNavigatedTo(parameters, new_vm); } // refresh-bindings BindingUtilities.UpdateBindings(new_page); // finally return(this.Successful()); }
private INavigationParameters CreateDefaultParameters(INavigationParameters parameters, Prism.Navigation.NavigationMode mode) { parameters = parameters ?? new NavigationParameters(); parameters.SetNavigationMode(mode); parameters.SetNavigationService(_navigationService); parameters.SetDispatcher(_dispatcher); return(parameters); }
private async Task <INavigationResult> OrchestrateNavigation(INavigationParameters parameters, Prism.Navigation.NavigationMode mode, Func <bool> navigate) { // default parameters parameters = parameters ?? new NavigationParameters(); parameters.SetNavigationMode(mode); parameters.SetNavigationService(_navigationService); // hold prev vm var old_vm = (_frame.Content as Page)?.DataContext; // CanNavigateAsync if (old_vm is IConfirmNavigationAsync old_vm_confirma) { if (!await old_vm_confirma.CanNavigateAsync(parameters)) { return(NavigationResult.Failure($"{old_vm_confirma}.CanNavigateAsync returned false.")); } } // CanNavigate if (old_vm is IConfirmNavigation old_vm_confirms) { if (!old_vm_confirms.CanNavigate(parameters)) { return(NavigationResult.Failure($"{old_vm_confirms}.CanNavigate returned false.")); } } // navigate await NavigateInternalAsync(navigate); // OnNavigatedFrom if (old_vm is INavigatedAware old_vm_ed) { old_vm_ed.OnNavigatedFrom(parameters); } // hold new vm var new_vm = (_frame.Content as Page)?.DataContext; // OnNavigatingTo if (new_vm is INavigatingAware new_vm_ing) { new_vm_ing.OnNavigatingTo(parameters); } // OnNavigatedTo if (new_vm is INavigatedAware new_vm_ed) { new_vm_ed.OnNavigatedTo(parameters); } // finally return(NavigationResult.Successful()); }
private async Task <INavigationResult> OrchestrateAsync( INavigationParameters parameters, Prism.Navigation.NavigationMode mode, Func <Task <bool> > navigate) { // setup default parameters parameters = CreateDefaultParameters(parameters, mode); // pre-events var old_vm = (_frame.Content as Page)?.DataContext; if (old_vm == null) { Debug.WriteLine($"[From]View-Model is null."); } else if (!await CanNavigateAsync(parameters, old_vm)) { return(NavigationResult.Failure($"[From]{old_vm}.CanNavigateAsync returned false.")); } else if (!CanNavigate(parameters, old_vm)) { return(NavigationResult.Failure($"[From]{old_vm}.CanNavigate returned false.")); } // navigate var success = await NavigateFrameAsync(navigate); Debug.WriteLine($"{nameof(FrameFacade)}.{nameof(OrchestrateAsync)}.NavigateFrameAsync() returned {success}."); if (!success) { return(NavigationResult.Failure("NavigateFrameAsync() returned false.")); } var new_page = _frame.Content as Page; if (new_page == null) { throw new Exception("There is no new page in Frame after Navigate."); } // post-events if (old_vm != null) { OnNavigatedFrom(parameters, old_vm); } var new_vm = new_page?.DataContext; if (new_vm == null) { if (Central.Registry.TryGetRegistration(_frame.CurrentSourcePageType, out var info) && info.ViewModel != null) { new_page.DataContext = new_vm = Central.Container.Resolve(info.ViewModel); } } if (new_vm == null) { Debug.WriteLine($"[To]View-Model is null."); } else { await OnNavigatedToAsync(parameters, new_vm); OnNavigatingTo(parameters, new_vm); OnNavigatedTo(parameters, new_vm); } // refresh-bindings BindingUtilities.UpdateBindings(new_page); // finally return(NavigationResult.Successful()); }