コード例 #1
0
        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);
            }
        }
コード例 #2
0
        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);
        }