private static IMvxViewModel LoadViewModel(this IMvxFragmentView fragmentView, IMvxBundle savedState,
                                                   MvxViewModelRequest request = null)
        {
            var viewModelType = fragmentView.FindAssociatedViewModelTypeOrNull();

            if (viewModelType == typeof(MvxNullViewModel))
            {
                return(new MvxNullViewModel());
            }

            if (viewModelType == null ||
                viewModelType == typeof(IMvxViewModel))
            {
                MvxTrace.Trace("No ViewModel class specified for {0} in LoadViewModel",
                               fragmentView.GetType().Name);
            }

            if (request == null)
            {
                request = MvxViewModelRequest.GetDefaultRequest(viewModelType);
            }

            var loaderService = Mvx.Resolve <IMvxViewModelLoader>();
            var viewModel     = loaderService.LoadViewModel(request, savedState);

            return(viewModel);
        }
        public static void OnCreate(this IMvxFragmentView fragmentView, IMvxBundle bundle, MvxViewModelRequest request = null)
        {
            if (fragmentView.ViewModel != null)
            {
                Mvx.Trace("Fragment {0} already has a ViewModel, skipping ViewModel rehydration",
                          fragmentView.GetType().ToString());
                return;
            }

            var view          = fragmentView as IMvxView;
            var viewModelType = fragmentView.FindAssociatedViewModelTypeOrNull();

            var cache  = Mvx.Resolve <IMvxMultipleViewModelCache>();
            var cached = cache.GetAndClear(viewModelType);

            view.OnViewCreate(() => cached ?? LoadViewModel(fragmentView, bundle, request));
        }
        public static void OnCreate(this IMvxFragmentView fragmentView, IMvxBundle bundle, MvxViewModelRequest request = null)
        {
            if (fragmentView.ViewModel != null)
            {
                //TODO call MvxViewModelLoader.Reload when it's added in MvvmCross, tracked by #1165
                //until then, we're going to re-run the viewmodel lifecycle here.
                RunViewModelLifecycle(fragmentView.ViewModel, bundle, request);

                return;
            }

            var view          = fragmentView as IMvxView;
            var viewModelType = fragmentView.FindAssociatedViewModelTypeOrNull();

            var cache  = Mvx.Resolve <IMvxMultipleViewModelCache>();
            var cached = cache.GetAndClear(viewModelType);

            view.OnViewCreate(() => cached ?? LoadViewModel(fragmentView, bundle, request));
        }
        public static Type FindAssociatedViewModelType(this IMvxFragmentView fragmentView, Type fragmentActivityParentType)
        {
            var viewModelType = fragmentView.FindAssociatedViewModelTypeOrNull();

            var type = fragmentView.GetType();

            if (viewModelType == null)
            {
                if (!type.HasMvxFragmentAttribute())
                {
                    throw new InvalidOperationException($"Your fragment is not generic and it does not have {nameof(MvxFragmentAttribute)} attribute set!");
                }

                var cacheableFragmentAttribute = type.GetMvxFragmentAttribute(fragmentActivityParentType);
                if (cacheableFragmentAttribute.ViewModelType == null)
                {
                    throw new InvalidOperationException($"Your fragment is not generic and it does not use {nameof(MvxFragmentAttribute)} with ViewModel Type constructor.");
                }

                viewModelType = cacheableFragmentAttribute.ViewModelType;
            }

            return(viewModelType);
        }