/// <summary> /// Register a ViewModel agains a View /// </summary> /// <param name="viewModel">The ViewModel type</param> /// <param name="view">The View type</param> public void Register(Type view, Type viewModel = null) { ViewMapAttribute map = view.GetAttribute <ViewMapAttribute>(); if (map == null) { if (viewModel == null) { return; } map = new ViewMapAttribute(viewModel); } map.View = view; _resolver.Register(view); _resolver.Register(map.ViewModel); _mappings[map.ViewModel] = map; }
/// <summary> /// Resolves a View and its related ViewModel /// </summary> /// <param name="viewModelType">The ViewModel type</param> /// <param name="vm">The output ViewModel instance</param> /// <returns>The ViewModel instance</returns> public Xamarin.Forms.Page Resolve(Type viewModelType, out IViewModel viewModel) { var vm = _resolver.Resolve(viewModelType) as ViewModel; Xamarin.Forms.Application.Current.On <iOS>().SetPanGestureRecognizerShouldRecognizeSimultaneously(true); Xamarin.Forms.Page view = null; ViewMapAttribute map = _mappings[viewModelType]; if (vm == null || map == null) { throw new InvalidOperationException("View Model not mapped!"); } Xamarin.Forms.Page pageView = _resolver.Resolve(map.View) as Xamarin.Forms.Page; if (pageView == null) { string message = string.Format("Page not mapped! View Model: {0}", viewModelType); throw new InvalidOperationException(message); } if (map.MenuViewModel == null) { view = pageView; view.On <iOS>().SetUseSafeArea(true); } else { IViewModel menuViewModel = null; Xamarin.Forms.Page menuView = Resolve(map.MenuViewModel, out menuViewModel); if (menuView != null) { pageView.BindingContext = vm; pageView.Parent = null; menuView.Parent = null; if (string.IsNullOrWhiteSpace(menuView.Title)) { menuView.Title = menuView.GetType().Name; } if (string.IsNullOrWhiteSpace(pageView.Title)) { pageView.Title = pageView.GetType().Name; } view = new MasterDetailPage { Master = menuView, Detail = pageView }; pageView.On <iOS>().SetUseSafeArea(true); } } view.Title = vm.Title; view.BindingContext = vm; if (map.HideNavigation) { Xamarin.Forms.NavigationPage.SetHasNavigationBar(view, false); } viewModel = vm; return(view); }