Example #1
0
        public async virtual Task CallNavigatingToAsync(INavigatingAware vm, INavigationParameter parameter, NavigationModes mode)
        {
            this.LogInfo();

            if (vm == null)
            {
                return;
            }

            await vm.OnNavigatingToAsync(parameter, mode);
        }
Example #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);
        }
Example #3
0
 private async Task <bool> InternalNavigateAsync(Type page, object parameter, NavigationModes mode, Func <bool> navigate)
 {
     return(await InternalNavigateAsync(page, new NavigationParameter(parameter), mode, navigate));
 }
Example #4
0
        public async virtual Task CallNavigatingToAsync(INavigatingAware vm, INavigationParameter parameter, NavigationModes mode)
        {
            this.LogInfo();

            if (vm == null)
            {
                return;
            }

            await vm.OnNavigatingToAsync(parameter, mode);
        }