Exemple #1
0
        protected virtual INavigationContext CreateContextNavigateTo(NavigationEventArgsBase args)
        {
            IViewModel viewModelFrom = null, viewModelTo = null;

            if (args.NavigationMode.IsClose())
            {
                viewModelFrom = args.Context.GetData(NavigationConstants.ViewModel);
            }
            else
            {
                viewModelTo = args.Context.GetData(NavigationConstants.ViewModel);
            }

            if (viewModelFrom == null)
            {
                viewModelFrom = CurrentViewModel;
            }
            if (args.NavigationMode == NavigationMode.Remove)
            {
                if (viewModelFrom != null)
                {
                    return(new NavigationContext(NavigationType.Page, NavigationMode.Remove, viewModelFrom, null, this, args.Context));
                }
                Tracer.Error("Possible bug in navigation, navigate with mode Remove mode without ViewModel");
            }

            Guid viewModelId;
            var  vmType = GetViewModelTypeFromParameter(args.Parameter, out viewModelId);

            if (viewModelTo == null && vmType != null)
            {
                viewModelTo = ViewModelProvider.TryGetViewModelById(viewModelId);
            }
            if (vmType == null)
            {
                if (args.Content != null)
                {
                    var items = ViewMappingProvider.FindMappingsForView(args.Content.GetType(), false);
                    if (items.Count == 1)
                    {
                        var type = items[0].ViewModelType;
#if WINDOWS_UWP || XAMARIN_FORMS
                        if (!type.GetTypeInfo().IsGenericTypeDefinition)
#else
                        if (!type.IsGenericTypeDefinition)
#endif

                        { vmType = type; }
                    }
                }
                if (vmType == null)
                {
                    return(new NavigationContext(NavigationType.Page, args.NavigationMode, viewModelFrom, viewModelTo, this, args.Context));
                }
            }
            return(new NavigationContext(NavigationType.Page, args.NavigationMode, viewModelFrom, viewModelTo, this, args.Context)
            {
                { ViewModelTypeConstant, vmType }
            });
        }
        protected virtual void NavigationServiceOnNavigated(object sender, NavigationEventArgsBase e)
        {
            string idOperation = null;

            try
            {
                var context = CreateContextNavigateTo(CurrentViewModel, e);
                idOperation = context.GetData(OperationIdConstant);
                IOperationCallback callback = null;
                if (idOperation == _currentOperationId)
                {
                    callback            = _currentCallback;
                    _currentCallback    = null;
                    _navigationTargetVm = null;
                    _lastContext        = null;
                }
                UpdateNavigationContext(callback, context.ViewModelTo, e, ref context);
                OnNavigated(context);
            }
            finally
            {
                if (idOperation == _currentOperationId)
                {
                    _currentOperationId = null;
                    var tcs = _navigatedTcs;
                    if (tcs != null)
                    {
                        _navigatedTcs = null;
                        tcs.TrySetResult(null);
                    }
                }
            }
        }
Exemple #3
0
        public virtual void OnNavigated(NavigationEventArgsBase e)
        {
            EventHandler <INavigationService, NavigationEventArgsBase> handler = Navigated;

            if (handler != null)
            {
                handler(this, e);
            }
        }
        /// <summary>
        ///     Subscriber to the Navigated event.
        /// </summary>
        protected virtual void NavigationServiceOnNavigated(object sender, NavigationEventArgsBase e)
        {
            var callback = _currentCallback;
            var vm       = _navigationTargetVm;
            var context  = CreateContextNavigateTo(CurrentViewModel, vm, e);

            UpdateNavigationContext(callback, vm, e, ref context);
            OnNavigated(context);
        }
        private void RaiseNavigated(NavigationEventArgsBase args)
        {
            var navigated = Navigated;

            if (navigated != null)
            {
                navigated(this, args);
            }
        }
        private void RaiseNavigated(NavigationEventArgsBase args)
        {
            var handler = Navigated;

            if (handler != null)
            {
                handler(this, args);
            }
        }
        private void UpdateNavigationContext(NavigationEventArgsBase args, ref INavigationContext context)
        {
            var vmType = context.GetData(ViewModelTypeConstant);

            if (vmType == null)
            {
                return;
            }

            var viewModel = GetViewModelForView(args, context.ViewModelTo, context, vmType);

            if (!ReferenceEquals(context.ViewModelTo, viewModel))
            {
                context = new NavigationContext(NavigationType.Page, context.NavigationMode, context.ViewModelFrom, viewModel, context.NavigationProvider, args.Context);
            }
        }
 private void NavigationServiceOnNavigated(object sender, NavigationEventArgsBase args)
 {
     try
     {
         if (!args.Context.Contains(NavigatedTaskConstant) && _unobservedNavigationTcs == null)
         {
             _unobservedNavigationTcs = new TaskCompletionSource <bool>();
         }
         var context = CreateContextNavigateTo(args);
         UpdateNavigationContext(args, ref context);
         OnNavigated(context);
     }
     finally
     {
         TryCompleteNavigationTask(args.Context, true);
     }
 }
        protected virtual IViewModel GetViewModelForView([NotNull] NavigationEventArgsBase args,
                                                         [CanBeNull] IViewModel navigationViewModel, [NotNull] INavigationContext context, [NotNull] Type vmType)
        {
            var view = args.Content;

            if (navigationViewModel != null)
            {
                ViewManager.InitializeViewAsync(navigationViewModel, view, context).WithTaskExceptionHandler(this);
                return(navigationViewModel);
            }

            IViewModel vm = null;

            if (CachePolicy != null)
            {
                vm = CachePolicy.TryTakeViewModelFromCache(context, view);
            }

            if (HasViewModel(view, vmType))
            {
                return((IViewModel)MugenMvvmToolkit.Infrastructure.ViewManager.GetDataContext(view));
            }
            if (vm == null)
            {
                IDataContext viewModelState = null;
#if WINDOWS_UWP
                viewModelState = PlatformExtensions.GetViewModelState(view);
                if (viewModelState != null)
                {
                    PlatformExtensions.SetViewModelState(view, null);
                }
#endif
                vm = ViewModelProvider.RestoreViewModel(viewModelState, new DataContext
                {
                    { InitializationConstants.ViewModelType, vmType }
                }, true);
            }

            if (vm != null)
            {
                ViewManager.InitializeViewAsync(vm, view, context).WithTaskExceptionHandler(this);
            }
            return(vm);
        }
        protected virtual IViewModel GetViewModelForView([NotNull] NavigationEventArgsBase args,
                                                         [CanBeNull] IViewModel navigationViewModel, [NotNull] INavigationContext context, [NotNull] Type vmType)
        {
            var view = args.Content;

            if (navigationViewModel != null)
            {
                ViewManager.InitializeViewAsync(navigationViewModel, view, context);
                return(navigationViewModel);
            }


            if (HasViewModel(view, vmType))
            {
                return((IViewModel)ToolkitExtensions.GetDataContext(view));
            }

            IDataContext viewModelState = null;

#if WINDOWS_UWP
            viewModelState = UwpToolkitExtensions.GetViewModelState(view);
            if (viewModelState != null)
            {
                UwpToolkitExtensions.SetViewModelState(view, null);
            }
#endif
            var vm = ViewModelProvider.RestoreViewModel(viewModelState, new DataContext
            {
                { InitializationConstants.ViewModelType, vmType }
            }, true);

            if (vm != null)
            {
                ViewManager.InitializeViewAsync(vm, view, context);
                if (viewModelState == null && !vm.Settings.Metadata.GetData(NavigationConstants.DoNotDisposeNoStateViewModel))
                {
                    vm.RegisterNavigationOperation(OperationType.PageNavigation, context)
                    .ContinueWith <IViewModel>((viewModel, result) => viewModel.Dispose());
                }
            }
            return(vm);
        }
        protected virtual IViewModel GetViewModelForView([NotNull] NavigationEventArgsBase args,
                                                         [CanBeNull] IViewModel navigationViewModel, [NotNull] INavigationContext context, [NotNull] Type vmType)
        {
            var view = args.Content;

            if (navigationViewModel != null)
            {
                ViewManager.InitializeViewAsync(navigationViewModel, view).WithTaskExceptionHandler(this);
                return(navigationViewModel);
            }
            //Trying to get from cache.
            IViewModel vm = TryTakeViewModelFromCache(context, view);

            if (HasViewModel(view, vmType))
            {
                return((IViewModel)ViewManagerEx.GetDataContext(view));
            }
            if (vm == null)
            {
                IDataContext viewModelState = null;
#if WINDOWS_PHONE || NETFX_CORE || WINDOWSCOMMON
                viewModelState = PlatformExtensions.GetViewModelState(view);
                if (viewModelState != null)
                {
                    PlatformExtensions.SetViewModelState(view, null);
                }
#endif
                vm = ViewModelProvider.RestoreViewModel(viewModelState, new DataContext
                {
                    { InitializationConstants.ViewModelType, vmType }
                }, false);
            }

            if (vm != null)
            {
                ViewManager.InitializeViewAsync(vm, view).WithTaskExceptionHandler(this);
            }
            return(vm);
        }
Exemple #12
0
        protected virtual IViewModel GetViewModelForView([NotNull] NavigationEventArgsBase args,
                                                         [CanBeNull] IViewModel navigationViewModel, [NotNull] INavigationContext context, [NotNull] Type vmType)
        {
            var view = args.Content;

            if (navigationViewModel != null)
            {
                ViewManager.InitializeViewAsync(navigationViewModel, view, context);
                return(navigationViewModel);
            }


            if (HasViewModel(view, vmType))
            {
                return((IViewModel)ToolkitExtensions.GetDataContext(view));
            }

            IDataContext viewModelState = null;

#if WINDOWS_UWP
            viewModelState = UwpToolkitExtensions.GetViewModelState(view);
            if (viewModelState != null)
            {
                UwpToolkitExtensions.SetViewModelState(view, null);
            }
#endif
            var vm = ViewModelProvider.RestoreViewModel(viewModelState, new DataContext
            {
                { InitializationConstants.ViewModelType, vmType }
            }, true);

            if (vm != null)
            {
                ViewManager.InitializeViewAsync(vm, view, context);
            }
            return(vm);
        }
Exemple #13
0
 private void RaiseNavigated(NavigationEventArgsBase args)
 {
     Navigated?.Invoke(this, args);
 }
        private void UpdateNavigationContext(IOperationCallback callback, IViewModel navigationViewModel, NavigationEventArgsBase args, ref INavigationContext context)
        {
            var vmType = context.GetData(ViewModelTypeConstant);

            if (vmType == null)
            {
                return;
            }

            var viewModel = GetViewModelForView(args, navigationViewModel, context, vmType);

            if (!ReferenceEquals(context.ViewModelTo, viewModel))
            {
                context = new NavigationContext(NavigationType.Page, context.NavigationMode, context.ViewModelFrom, viewModel, context.NavigationProvider);
            }
            if (viewModel != null && callback != null)
            {
                RegisterOperationCallback(viewModel, callback, context);
            }
        }
        protected virtual INavigationContext CreateContextNavigateTo(IViewModel viewModelFrom, NavigationEventArgsBase args)
        {
            string idOperation;
            var    vmType      = GetViewModelTypeFromParameter(NavigationService.GetParameterFromArgs(args), out idOperation);
            var    viewModelTo = idOperation == _currentOperationId ? _navigationTargetVm : null;

            if (vmType == null)
            {
                if (args.Content != null)
                {
                    var items = _mappingProvider.FindMappingsForView(args.Content.GetType(), false);
                    if (items.Count == 1)
                    {
                        var type = items[0].ViewModelType;
#if WINDOWSCOMMON || XAMARIN_FORMS
                        if (!type.GetTypeInfo().IsGenericTypeDefinition)
#else
                        if (!type.IsGenericTypeDefinition)
#endif

                        { vmType = type; }
                    }
                }
                if (vmType == null)
                {
                    return new NavigationContext(NavigationType.Page, args.Mode, viewModelFrom, viewModelTo, this)
                           {
                               { NavigationArgsConstant, args },
                               { OperationIdConstant, idOperation }
                           }
                }
                ;
            }
            return(new NavigationContext(NavigationType.Page, args.Mode, viewModelFrom, viewModelTo, this)
            {
                { NavigationArgsConstant, args },
                { ViewModelTypeConstant, vmType },
                { OperationIdConstant, idOperation }
            });
        }
        protected virtual INavigationContext CreateContextNavigateTo(IViewModel viewModelFrom, IViewModel viewModelTo, NavigationEventArgsBase args)
        {
            IDataContext parameters;
            var          vmType = GetViewModelTypeFromParameter(NavigationService.GetParameterFromArgs(args), out parameters);

            if (vmType == null)
            {
                if (args.Content != null)
                {
                    var items = _mappingProvider.FindMappingsForView(args.Content.GetType(), false);
                    if (items.Count == 1)
                    {
                        var type = items[0].ViewModelType;
#if NETFX_CORE || WINDOWSCOMMON || XAMARIN_FORMS
                        if (!type.GetTypeInfo().IsGenericTypeDefinition)
#else
                        if (!type.IsGenericTypeDefinition)
#endif

                        { vmType = type; }
                    }
                }
                if (vmType == null)
                {
                    return(new NavigationContext(args.Mode, viewModelFrom, viewModelTo, this, parameters));
                }
            }
            return(new NavigationContext(args.Mode, viewModelFrom, viewModelTo, this, parameters)
            {
                { NavigationArgsConstant, args },
                { ViewModelType, vmType }
            });
        }
Exemple #17
0
 public virtual void OnNavigated(NavigationEventArgsBase e)
 {
     Navigated?.Invoke(this, e);
 }