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); }