From 14efed11a847bd09ea0df595757ea39250cbecff Mon Sep 17 00:00:00 2001 From: David Britch Date: Tue, 7 Mar 2017 16:47:11 +0000 Subject: [PATCH] ViewModelLocator is now responsible for connecting view models to views. Uses an auto-wiring convention-based approach. --- .../eShopOnContainers.Core/App.xaml.cs | 7 +- .../Helpers/ServicesHelper.cs | 6 +- .../Helpers/Settings.cs | 4 +- .../Services/Navigation/INavigationService.cs | 2 +- .../Services/Navigation/NavigationService.cs | 50 ++------ .../Validations/ValidatableObject.cs | 2 +- .../ViewModels/Base/ExtendedBindableObject.cs | 2 +- .../ViewModels/Base/ViewModelBase.cs | 11 +- .../ViewModels/Base/ViewModelLocator.cs | 116 +++++++++--------- .../ViewModels/BasketViewModel.cs | 2 - .../ViewModels/CatalogViewModel.cs | 5 +- .../ViewModels/CheckoutViewModel.cs | 4 +- .../ViewModels/LoginViewModel.cs | 5 +- .../ViewModels/MainViewModel.cs | 2 +- .../ViewModels/OrderDetailViewModel.cs | 2 +- .../ViewModels/ProfileViewModel.cs | 2 +- .../ViewModels/SettingsViewModel.cs | 4 +- .../Views/BasketView.xaml | 6 +- .../Views/CatalogView.xaml | 8 +- .../Views/CatalogView.xaml.cs | 3 +- .../Views/CheckoutView.xaml | 6 +- .../Views/LoginView.xaml | 4 +- .../Views/MainView.xaml | 6 +- .../Views/MainView.xaml.cs | 15 +-- .../Views/OrderDetailView.xaml | 6 +- .../Views/ProfileView.xaml | 8 +- .../Views/SettingsView.xaml | 8 +- 27 files changed, 137 insertions(+), 159 deletions(-) diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/App.xaml.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/App.xaml.cs index 2c5a73cfb..5886be0bb 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/App.xaml.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/App.xaml.cs @@ -1,6 +1,6 @@ using eShopOnContainers.Core.Helpers; using eShopOnContainers.Services; -using eShopOnContainers.ViewModels.Base; +using eShopOnContainers.Core.ViewModels.Base; using System.Threading.Tasks; using Xamarin.Forms; using Xamarin.Forms.Xaml; @@ -28,12 +28,13 @@ namespace eShopOnContainers { UseMockServices = Settings.UseMocks; - ViewModelLocator.Instance.UpdateDependencies(UseMockServices); + ViewModelLocator.Initialize(); + ViewModelLocator.UpdateDependencies(UseMockServices); } private Task InitNavigation() { - var navigationService = ViewModelLocator.Instance.Resolve(); + var navigationService = ViewModelLocator.Resolve(); return navigationService.InitializeAsync(); } diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Helpers/ServicesHelper.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Helpers/ServicesHelper.cs index 29bbe2718..5241fd823 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Helpers/ServicesHelper.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Helpers/ServicesHelper.cs @@ -1,6 +1,6 @@ using eShopOnContainers.Core.Models.Basket; using eShopOnContainers.Core.Models.Catalog; -using eShopOnContainers.ViewModels.Base; +using eShopOnContainers.Core.ViewModels.Base; using System; using System.Collections.Generic; using System.Diagnostics; @@ -21,7 +21,7 @@ namespace eShopOnContainers.Core.Helpers try { - if (!ViewModelLocator.Instance.UseMockService + if (!ViewModelLocator.UseMockService && Settings.UrlBase != GlobalSetting.DefaultEndpoint) { foreach (var catalogItem in catalogItems) @@ -54,7 +54,7 @@ namespace eShopOnContainers.Core.Helpers try { - if (!ViewModelLocator.Instance.UseMockService + if (!ViewModelLocator.UseMockService && Settings.UrlBase != GlobalSetting.DefaultEndpoint) { foreach (var basketItem in basketItems) diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Helpers/Settings.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Helpers/Settings.cs index 71bd832bc..d698dc101 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Helpers/Settings.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Helpers/Settings.cs @@ -1,4 +1,4 @@ -using eShopOnContainers.ViewModels.Base; +using eShopOnContainers.Core.ViewModels.Base; using Plugin.Settings; using Plugin.Settings.Abstractions; @@ -27,7 +27,7 @@ namespace eShopOnContainers.Core.Helpers private const string IdUrlBase = "url_base"; private static readonly string AccessTokenDefault = string.Empty; private static readonly string IdTokenDefault = string.Empty; - private static readonly bool UseMocksDefault = ViewModelLocator.Instance.UseMockService; + private static readonly bool UseMocksDefault = ViewModelLocator.UseMockService; private static readonly string UrlBaseDefault = GlobalSetting.Instance.BaseEndpoint; #endregion diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Navigation/INavigationService.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Navigation/INavigationService.cs index ce3c56964..64ef7d807 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Navigation/INavigationService.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Navigation/INavigationService.cs @@ -1,4 +1,4 @@ -using eShopOnContainers.ViewModels.Base; +using eShopOnContainers.Core.ViewModels.Base; using System; using System.Threading.Tasks; diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Navigation/NavigationService.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Navigation/NavigationService.cs index 22383fdb1..32cd2ee9a 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Navigation/NavigationService.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Navigation/NavigationService.cs @@ -1,9 +1,10 @@ using eShopOnContainers.Core.Helpers; using eShopOnContainers.Core.ViewModels; using eShopOnContainers.Core.Views; -using eShopOnContainers.ViewModels.Base; +using eShopOnContainers.Core.ViewModels.Base; using System; -using System.Collections.Generic; +using System.Globalization; +using System.Reflection; using System.Threading.Tasks; using Xamarin.Forms; @@ -11,9 +12,7 @@ namespace eShopOnContainers.Services { public class NavigationService : INavigationService { - protected readonly Dictionary _mappings; - - protected Application CurrentApplication + protected Application CurrentApplication { get { @@ -21,13 +20,6 @@ namespace eShopOnContainers.Services } } - public NavigationService() - { - _mappings = new Dictionary(); - - CreatePageViewModelMappings(); - } - public Task InitializeAsync() { if(string.IsNullOrEmpty(Settings.AuthAccessToken)) @@ -100,7 +92,7 @@ namespace eShopOnContainers.Services protected virtual async Task InternalNavigateToAsync(Type viewModelType, object parameter) { - Page page = CreateAndBindPage(viewModelType, parameter); + Page page = CreatePage(viewModelType, parameter); if (page is LoginView) { @@ -109,7 +101,6 @@ namespace eShopOnContainers.Services else { var navigationPage = CurrentApplication.MainPage as CustomNavigationView; - if (navigationPage != null) { await navigationPage.PushAsync(page); @@ -125,40 +116,23 @@ namespace eShopOnContainers.Services protected Type GetPageTypeForViewModel(Type viewModelType) { - if (!_mappings.ContainsKey(viewModelType)) - { - throw new KeyNotFoundException($"No map for ${viewModelType} was found on navigation mappings"); - } - - return _mappings[viewModelType]; + var viewName = viewModelType.FullName.Replace("Model", string.Empty); + var viewModelAssemblyName = viewModelType.GetTypeInfo().Assembly.FullName; + var viewAssemblyName = string.Format(CultureInfo.InvariantCulture, "{0}, {1}", viewName, viewModelAssemblyName); + var viewType = Type.GetType(viewAssemblyName); + return viewType; } - protected Page CreateAndBindPage(Type viewModelType, object parameter) + protected Page CreatePage(Type viewModelType, object parameter) { Type pageType = GetPageTypeForViewModel(viewModelType); - if (pageType == null) { - throw new Exception($"Mapping type for {viewModelType} is not a page"); + throw new Exception($"Cannot locate page type for {viewModelType}"); } Page page = Activator.CreateInstance(pageType) as Page; - ViewModelBase viewModel = ViewModelLocator.Instance.Resolve(viewModelType) as ViewModelBase; - page.BindingContext = viewModel; - return page; } - - private void CreatePageViewModelMappings() - { - _mappings.Add(typeof(BasketViewModel), typeof(BasketView)); - _mappings.Add(typeof(CatalogViewModel), typeof(CatalogView)); - _mappings.Add(typeof(CheckoutViewModel), typeof(CheckoutView)); - _mappings.Add(typeof(LoginViewModel), typeof(LoginView)); - _mappings.Add(typeof(MainViewModel), typeof(MainView)); - _mappings.Add(typeof(OrderDetailViewModel), typeof(OrderDetailView)); - _mappings.Add(typeof(ProfileViewModel), typeof(ProfileView)); - _mappings.Add(typeof(SettingsViewModel), typeof(SettingsView)); - } } } \ No newline at end of file diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Validations/ValidatableObject.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Validations/ValidatableObject.cs index b7caa0d0d..d7dcdf737 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Validations/ValidatableObject.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Validations/ValidatableObject.cs @@ -1,4 +1,4 @@ -using eShopOnContainers.ViewModels.Base; +using eShopOnContainers.Core.ViewModels.Base; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/Base/ExtendedBindableObject.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/Base/ExtendedBindableObject.cs index eab1380aa..96ae124c0 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/Base/ExtendedBindableObject.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/Base/ExtendedBindableObject.cs @@ -3,7 +3,7 @@ using System.Linq.Expressions; using System.Reflection; using Xamarin.Forms; -namespace eShopOnContainers.ViewModels.Base +namespace eShopOnContainers.Core.ViewModels.Base { public abstract class ExtendedBindableObject : BindableObject { diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/Base/ViewModelBase.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/Base/ViewModelBase.cs index 299c2985a..376315d8f 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/Base/ViewModelBase.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/Base/ViewModelBase.cs @@ -1,9 +1,8 @@ -using eShopOnContainers.Core; -using eShopOnContainers.Core.Helpers; +using eShopOnContainers.Core.Helpers; using eShopOnContainers.Services; using System.Threading.Tasks; -namespace eShopOnContainers.ViewModels.Base +namespace eShopOnContainers.Core.ViewModels.Base { public abstract class ViewModelBase : ExtendedBindableObject { @@ -28,14 +27,14 @@ namespace eShopOnContainers.ViewModels.Base public ViewModelBase() { - DialogService = ViewModelLocator.Instance.Resolve(); - NavigationService = ViewModelLocator.Instance.Resolve(); + DialogService = ViewModelLocator.Resolve(); + NavigationService = ViewModelLocator.Resolve(); GlobalSetting.Instance.BaseEndpoint = Settings.UrlBase; } public virtual Task InitializeAsync(object navigationData) { - return Task.FromResult(false); + return Task.FromResult(false); } } } \ No newline at end of file diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/Base/ViewModelLocator.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/Base/ViewModelLocator.cs index 82145d466..fd52cba04 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/Base/ViewModelLocator.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/Base/ViewModelLocator.cs @@ -1,7 +1,8 @@ using Microsoft.Practices.Unity; -using eShopOnContainers.Core.ViewModels; using eShopOnContainers.Services; using System; +using System.Globalization; +using System.Reflection; using eShopOnContainers.Core.Services.Catalog; using eShopOnContainers.Core.Services.OpenUrl; using eShopOnContainers.Core.Services.RequestProvider; @@ -9,54 +10,53 @@ using eShopOnContainers.Core.Services.Basket; using eShopOnContainers.Core.Services.Identity; using eShopOnContainers.Core.Services.Order; using eShopOnContainers.Core.Services.User; +using Xamarin.Forms; -namespace eShopOnContainers.ViewModels.Base +namespace eShopOnContainers.Core.ViewModels.Base { - public class ViewModelLocator + public static class ViewModelLocator { - private bool _useMockService; - private readonly IUnityContainer _unityContainer; + private static readonly IUnityContainer _unityContainer = new UnityContainer(); - private static readonly ViewModelLocator _instance = new ViewModelLocator(); + public static readonly BindableProperty AutoWireViewModelProperty = + BindableProperty.CreateAttached("AutoWireViewModel", typeof(bool), typeof(ViewModelLocator), default(bool), propertyChanged: OnAutoWireViewModelChanged); - public static ViewModelLocator Instance - { - get { return _instance; } - } - - public bool UseMockService - { - get { return _useMockService; } - set { _useMockService = value; ; } - } + public static bool GetAutoWireViewModel(BindableObject bindable) + { + return (bool)bindable.GetValue(ViewModelLocator.AutoWireViewModelProperty); + } - protected ViewModelLocator() - { - _unityContainer = new UnityContainer(); + public static void SetAutoWireViewModel(BindableObject bindable, bool value) + { + bindable.SetValue(ViewModelLocator.AutoWireViewModelProperty, value); + } - // Services - _unityContainer.RegisterType(); - RegisterSingleton(); - _unityContainer.RegisterType(); - _unityContainer.RegisterType(); - _unityContainer.RegisterType(); + public static bool UseMockService { get; set; } - _unityContainer.RegisterType(); - _unityContainer.RegisterType(); - _unityContainer.RegisterType(); + public static void Initialize() + { + // Services + _unityContainer.RegisterType(); + _unityContainer.RegisterType(new ContainerControlledLifetimeManager()); + _unityContainer.RegisterType(); + _unityContainer.RegisterType(); + _unityContainer.RegisterType(); + _unityContainer.RegisterType(); + _unityContainer.RegisterType(); + _unityContainer.RegisterType(); - // View models - _unityContainer.RegisterType(); - _unityContainer.RegisterType(); - _unityContainer.RegisterType(); - _unityContainer.RegisterType(); - _unityContainer.RegisterType(); - _unityContainer.RegisterType(); - _unityContainer.RegisterType(); - _unityContainer.RegisterType(); - } + // View models + _unityContainer.RegisterType(); + _unityContainer.RegisterType(); + _unityContainer.RegisterType(); + _unityContainer.RegisterType(); + _unityContainer.RegisterType(); + _unityContainer.RegisterType(); + _unityContainer.RegisterType(); + _unityContainer.RegisterType(); + } - public void UpdateDependencies(bool useMockServices) + public static void UpdateDependencies(bool useMockServices) { // Change injected dependencies if (useMockServices) @@ -80,29 +80,31 @@ namespace eShopOnContainers.ViewModels.Base } } - public T Resolve() + public static T Resolve() { return _unityContainer.Resolve(); } - public object Resolve(Type type) - { - return _unityContainer.Resolve(type); - } - - public void Register(T instance) - { - _unityContainer.RegisterInstance(instance); - } + private static void OnAutoWireViewModelChanged(BindableObject bindable, object oldValue, object newValue) + { + var view = bindable as Element; + if (view == null) + { + return; + } - public void Register() where T : TInterface - { - _unityContainer.RegisterType(); - } + var viewType = view.GetType(); + var viewName = viewType.FullName.Replace(".Views.", ".ViewModels."); + var viewAssemblyName = viewType.GetTypeInfo().Assembly.FullName; + var viewModelName = string.Format(CultureInfo.InvariantCulture, "{0}Model, {1}", viewName, viewAssemblyName); - public void RegisterSingleton() where T : TInterface - { - _unityContainer.RegisterType(new ContainerControlledLifetimeManager()); - } + var viewModelType = Type.GetType(viewModelName); + if (viewModelType == null) + { + return; + } + var viewModel = _unityContainer.Resolve(viewModelType); + view.BindingContext = viewModel; + } } } \ No newline at end of file diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/BasketViewModel.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/BasketViewModel.cs index a19e8dcdd..fe1949f0f 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/BasketViewModel.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/BasketViewModel.cs @@ -4,8 +4,6 @@ using eShopOnContainers.Core.Models.Catalog; using eShopOnContainers.Core.Services.Basket; using eShopOnContainers.Core.Services.User; using eShopOnContainers.Core.ViewModels.Base; -using eShopOnContainers.ViewModels.Base; -using System; using System.Collections.ObjectModel; using System.Linq; using System.Threading.Tasks; diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CatalogViewModel.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CatalogViewModel.cs index 789cc5e50..7863a0790 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CatalogViewModel.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CatalogViewModel.cs @@ -1,14 +1,11 @@ using System.Threading.Tasks; -using eShopOnContainers.ViewModels.Base; +using eShopOnContainers.Core.ViewModels.Base; using System.Collections.ObjectModel; using Xamarin.Forms; -using eShopOnContainers.Core.ViewModels.Base; using eShopOnContainers.Core.Models.Catalog; using eShopOnContainers.Core.Services.Catalog; using System.Windows.Input; -using System.Linq; using eShopOnContainers.Core.Services.Basket; -using eShopOnContainers.Core.Helpers; using eShopOnContainers.Core.Services.User; namespace eShopOnContainers.Core.ViewModels diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CheckoutViewModel.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CheckoutViewModel.cs index 41b8220e6..96488edfb 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CheckoutViewModel.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CheckoutViewModel.cs @@ -1,5 +1,5 @@ using eShopOnContainers.Core.Models.Navigation; -using eShopOnContainers.ViewModels.Base; +using eShopOnContainers.Core.ViewModels.Base; using System.Windows.Input; using Xamarin.Forms; using System.Threading.Tasks; @@ -138,7 +138,7 @@ namespace eShopOnContainers.Core.ViewModels await _basketService.ClearBasketAsync(_shippingAddress.Id.ToString(), authToken); // Reset Basket badge - var basketViewModel = ViewModelLocator.Instance.Resolve(); + var basketViewModel = ViewModelLocator.Resolve(); basketViewModel.BadgeCount = 0; // Navigate to Orders diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/LoginViewModel.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/LoginViewModel.cs index 53f5998a0..5ae1af4de 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/LoginViewModel.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/LoginViewModel.cs @@ -4,7 +4,7 @@ using eShopOnContainers.Core.Services.Identity; using eShopOnContainers.Core.Services.OpenUrl; using eShopOnContainers.Core.Services.User; using eShopOnContainers.Core.Validations; -using eShopOnContainers.ViewModels.Base; +using eShopOnContainers.Core.ViewModels.Base; using IdentityModel.Client; using System; using System.Diagnostics; @@ -133,10 +133,9 @@ namespace eShopOnContainers.Core.ViewModels public override Task InitializeAsync(object navigationData) { - if(navigationData is LogoutParameter) + if (navigationData is LogoutParameter) { var logoutParameter = (LogoutParameter)navigationData; - if (logoutParameter.Logout) { Logout(); diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/MainViewModel.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/MainViewModel.cs index aa279ee0d..eebc17e35 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/MainViewModel.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/MainViewModel.cs @@ -1,5 +1,5 @@ using System.Threading.Tasks; -using eShopOnContainers.ViewModels.Base; +using eShopOnContainers.Core.ViewModels.Base; using eShopOnContainers.Core.Models.Navigation; using Xamarin.Forms; using eShopOnContainers.Core.ViewModels.Base; diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/OrderDetailViewModel.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/OrderDetailViewModel.cs index 7156038af..86b5a906a 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/OrderDetailViewModel.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/OrderDetailViewModel.cs @@ -1,6 +1,6 @@ using System.Threading.Tasks; using eShopOnContainers.Core.Models.Orders; -using eShopOnContainers.ViewModels.Base; +using eShopOnContainers.Core.ViewModels.Base; using eShopOnContainers.Core.Services.Catalog; using eShopOnContainers.Core.Services.Basket; using eShopOnContainers.Core.Services.Order; diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/ProfileViewModel.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/ProfileViewModel.cs index 9856b7a21..2cc1ab9d9 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/ProfileViewModel.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/ProfileViewModel.cs @@ -3,7 +3,7 @@ using eShopOnContainers.Core.Helpers; using eShopOnContainers.Core.Models.Orders; using eShopOnContainers.Core.Models.User; using eShopOnContainers.Core.Services.Order; -using eShopOnContainers.ViewModels.Base; +using eShopOnContainers.Core.ViewModels.Base; using System.Collections.ObjectModel; using System.Threading.Tasks; using System.Windows.Input; diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/SettingsViewModel.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/SettingsViewModel.cs index 1fa5b54b6..c5a58b745 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/SettingsViewModel.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/SettingsViewModel.cs @@ -1,4 +1,4 @@ -using eShopOnContainers.ViewModels.Base; +using eShopOnContainers.Core.ViewModels.Base; using System.Windows.Input; using Xamarin.Forms; using System.Threading.Tasks; @@ -71,7 +71,7 @@ namespace eShopOnContainers.Core.ViewModels private void MockServices() { - ViewModelLocator.Instance.UpdateDependencies(!UseAzureServices); + ViewModelLocator.UpdateDependencies(!UseAzureServices); UpdateInfo(); } diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/BasketView.xaml b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/BasketView.xaml index e7499fd66..80fefefdf 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/BasketView.xaml +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/BasketView.xaml @@ -1,9 +1,11 @@ diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/CatalogView.xaml b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/CatalogView.xaml index 870980ac2..2d2d1ddde 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/CatalogView.xaml +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/CatalogView.xaml @@ -1,12 +1,14 @@ - + diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/CatalogView.xaml.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/CatalogView.xaml.cs index e2c9b4943..ce2b888ad 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/CatalogView.xaml.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/CatalogView.xaml.cs @@ -47,7 +47,8 @@ namespace eShopOnContainers.Core.Views { base.OnBindingContextChanged(); - _filterView.BindingContext = BindingContext; + if (_filterView != null) + _filterView.BindingContext = BindingContext; } private void OnFilterChanged(object sender, EventArgs e) diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/CheckoutView.xaml b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/CheckoutView.xaml index 921d739f3..a785e2e1c 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/CheckoutView.xaml +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/CheckoutView.xaml @@ -1,8 +1,10 @@ - + diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/LoginView.xaml b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/LoginView.xaml index d713e0691..9382a6556 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/LoginView.xaml +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/LoginView.xaml @@ -2,9 +2,11 @@ + xmlns:behaviors="clr-namespace:eShopOnContainers.Core.Behaviors;assembly=eShopOnContainers.Core" + viewModelBase:ViewModelLocator.AutoWireViewModel="true"> + + BarTextColor="{StaticResource WhiteColor}" + viewModelBase:ViewModelLocator.AutoWireViewModel="true"> (); - await homeViewModel.InitializeAsync(null); - HomeView.BindingContext = homeViewModel; - - var basketViewModel = ViewModelLocator.Instance.Resolve(); - await basketViewModel.InitializeAsync(null); - BasketView.BindingContext = basketViewModel; - - var profileViewModel = ViewModelLocator.Instance.Resolve(); - await profileViewModel.InitializeAsync(null); - ProfileView.BindingContext = profileViewModel; + await ((CatalogViewModel)HomeView.BindingContext).InitializeAsync(null); + await ((BasketViewModel)BasketView.BindingContext).InitializeAsync(null); + await ((ProfileViewModel)ProfileView.BindingContext).InitializeAsync(null); } } } diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/OrderDetailView.xaml b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/OrderDetailView.xaml index d0c2602fc..d424edbc0 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/OrderDetailView.xaml +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/OrderDetailView.xaml @@ -1,10 +1,12 @@ - + diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/ProfileView.xaml b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/ProfileView.xaml index 0662d40ac..57b00c7d0 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/ProfileView.xaml +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/ProfileView.xaml @@ -1,11 +1,13 @@ - + + viewModelBase:ViewModelLocator.AutoWireViewModel="true" + Title="My profile"> diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/SettingsView.xaml b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/SettingsView.xaml index b13a4855d..167e637e6 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/SettingsView.xaml +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/SettingsView.xaml @@ -1,11 +1,13 @@ - +