public override void Execute([NotNull] INavigationParameter parameter, Action <NavigationResult> navigationCallback) { if (parameter == null) { return; } var command = parameter as CommandNavigationParameter; if (command != null) { ExecuteCommand(command); } else if (parameter is RegionNavigationParameter) { ExecuteRegion((RegionNavigationParameter)parameter); } else if (parameter is ActionNavigationParameter) { ExecuteAction((ActionNavigationParameter)parameter); } else { throw new NotSupportedException(parameter.GetType().FullName); } }
private async Task <bool> InternalNavigateAsync(Type page, INavigationParameter parameter, NavigationModes mode, Func <bool> navigate) { this.LogInfo($"page: {page} parameter: {parameter} mode: {mode}"); // if the identical page+parameter, then don't go if ((page?.FullName == CurrentPage?.GetType().FullName) && (parameter?.Equals(CurrentParameter) ?? false)) { return(false); } // test parameter if (!parameter.GetType().GetTypeInfo().IsValueType) { throw new Exception("Page parameter is not a Value type. Only value types are supported."); } // if confirmation required, then ask var confirmNavigate = CurrentViewModel as IConfirmNavigation; if (confirmNavigate != null && !await confirmNavigate.CanNavigateAsync()) { return(false); } // call OnNavigatingFrom() var oldViewModel = CurrentViewModel; await NavigatingLogic.CallNavigatingFromAsync(oldViewModel as INavigatingAware); // call onNavigatingTo() if developer-supported var newViewModel = ViewModelLogic.ResolveViewModel(page); await NavigatedLogic.CallNavigatedToAsync(newViewModel as INavigatedAware, parameter, mode); // navigate Navigating?.Invoke(this, page); if (navigate.Invoke()) { CurrentNavigationMode = mode; Navigated?.Invoke(this, EventArgs.Empty); } else { this.LogError($"Navigation failed."); return(false); } // call OnNavigatedFrom() await NavigatedLogic.CallNavigatedFromAsync(oldViewModel as INavigationAware); // setup or accept view-model if (CurrentViewModel == null) { if (newViewModel == null) { CurrentPage.DataContext = ViewModelLogic.ResolveViewModel(CurrentPage); } else { CurrentPage.DataContext = newViewModel; } } // call OnNavigatedTo() newViewModel = newViewModel ?? ViewModelLogic.ResolveViewModel(page); await NavigatedLogic.CallNavigatedToAsync(newViewModel as INavigatedAware, parameter, mode); return(true); }