private bool HasViewModel(object view, Type viewModelType)
        {
            if (_navigationTargetVm != null && _navigationTargetVm.GetType().Equals(viewModelType))
            {
                return(true);
            }
            if (view == null)
            {
                return(false);
            }
            var viewModel = ViewManagerEx.GetDataContext(view) as IViewModel;

            if (viewModel == null)
            {
                return(false);
            }

            var vmType = viewModel.GetType();

#if NETFX_CORE || WINDOWSCOMMON || XAMARIN_FORMS
            if (!viewModelType.GetTypeInfo().IsGenericType)
#else
            if (!viewModelType.IsGenericType)
#endif
            { return(vmType.Equals(viewModelType)); }
#if NETFX_CORE || WINDOWSCOMMON || XAMARIN_FORMS
            if (!vmType.GetTypeInfo().IsGenericType)
#else
            if (!vmType.IsGenericType)
#endif
            { return(false); }
            return(vmType.GetGenericTypeDefinition().Equals(viewModelType.GetGenericTypeDefinition()));
        }
        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);
        }