From 561208ca81b607d7c81599afa888a40b886b937f Mon Sep 17 00:00:00 2001 From: David Britch Date: Mon, 20 Mar 2017 15:42:24 +0000 Subject: [PATCH 01/29] AnimationExtension isn't used. --- .../Extensions/AnimationExtension.cs | 18 ------------------ .../eShopOnContainers.Core.csproj | 1 - 2 files changed, 19 deletions(-) delete mode 100644 src/Mobile/eShopOnContainers/eShopOnContainers.Core/Extensions/AnimationExtension.cs diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Extensions/AnimationExtension.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Extensions/AnimationExtension.cs deleted file mode 100644 index edc9b07ab..000000000 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Extensions/AnimationExtension.cs +++ /dev/null @@ -1,18 +0,0 @@ -using eShopOnContainers.Core.Animations.Base; -using System; -using Xamarin.Forms; - -namespace eShopOnContainers.Core.Extensions -{ - public static class AnimationExtension - { - public static async void Animate(this VisualElement visualElement, AnimationBase animation, Action onFinishedCallback = null) - { - animation.Target = visualElement; - - await animation.Begin(); - - onFinishedCallback?.Invoke(); - } - } -} \ No newline at end of file diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/eShopOnContainers.Core.csproj b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/eShopOnContainers.Core.csproj index c38f528ec..4a898b528 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/eShopOnContainers.Core.csproj +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/eShopOnContainers.Core.csproj @@ -60,7 +60,6 @@ - From 00311b45d423069a56d4887e9d4cb19cb76e76aa Mon Sep 17 00:00:00 2001 From: David Britch Date: Mon, 20 Mar 2017 15:51:05 +0000 Subject: [PATCH 02/29] Replaced async void methods with async Task. --- .../ViewModels/BasketViewModel.cs | 22 +++++++++---------- .../ViewModels/CatalogViewModel.cs | 8 +++---- .../Views/CatalogView.xaml.cs | 8 ++----- 3 files changed, 17 insertions(+), 21 deletions(-) diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/BasketViewModel.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/BasketViewModel.cs index fe1949f0f..e546c4592 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/BasketViewModel.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/BasketViewModel.cs @@ -59,7 +59,7 @@ namespace eShopOnContainers.Core.ViewModels } } - public ICommand AddCommand => new Command(AddItem); + public ICommand AddCommand => new Command(async (item) => await AddItemAsync(item)); public ICommand CheckoutCommand => new Command(async () => await CheckoutAsync()); @@ -80,22 +80,22 @@ namespace eShopOnContainers.Core.ViewModels foreach (var basketItem in basket.Items) { BadgeCount += basketItem.Quantity; - AddBasketItem(basketItem); + await AddBasketItemAsync(basketItem); } } MessagingCenter.Unsubscribe(this, MessengerKeys.AddProduct); - MessagingCenter.Subscribe(this, MessengerKeys.AddProduct, (sender, arg) => + MessagingCenter.Subscribe(this, MessengerKeys.AddProduct, async (sender, arg) => { BadgeCount++; - AddCatalogItem(arg); + await AddCatalogItemAsync(arg); }); await base.InitializeAsync(navigationData); } - private void AddCatalogItem(CatalogItem item) + private async Task AddCatalogItemAsync(CatalogItem item) { BasketItems.Add(new BasketItem { @@ -106,26 +106,26 @@ namespace eShopOnContainers.Core.ViewModels Quantity = 1 }); - ReCalculateTotal(); + await ReCalculateTotalAsync(); } - private void AddItem(BasketItem item) + private async Task AddItemAsync(BasketItem item) { BadgeCount++; - AddBasketItem(item); + await AddBasketItemAsync(item); RaisePropertyChanged(() => BasketItems); } - private void AddBasketItem(BasketItem item) + private async Task AddBasketItemAsync(BasketItem item) { BasketItems.Add(item); - ReCalculateTotal(); + await ReCalculateTotalAsync(); } - private async void ReCalculateTotal() + private async Task ReCalculateTotalAsync() { Total = 0; diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CatalogViewModel.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CatalogViewModel.cs index 7863a0790..82767e9d7 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CatalogViewModel.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CatalogViewModel.cs @@ -88,9 +88,9 @@ namespace eShopOnContainers.Core.ViewModels public ICommand AddCatalogItemCommand => new Command(AddCatalogItem); - public ICommand FilterCommand => new Command(Filter); + public ICommand FilterCommand => new Command(async () => await FilterAsync()); - public ICommand ClearFilterCommand => new Command(ClearFilter); + public ICommand ClearFilterCommand => new Command(async () => await ClearFilterAsync()); public override async Task InitializeAsync(object navigationData) { @@ -110,7 +110,7 @@ namespace eShopOnContainers.Core.ViewModels MessagingCenter.Send(this, MessengerKeys.AddProduct, catalogItem); } - private async void Filter() + private async Task FilterAsync() { if (Brand == null && Type == null) { @@ -126,7 +126,7 @@ namespace eShopOnContainers.Core.ViewModels IsBusy = false; } - private async void ClearFilter() + private async Task ClearFilterAsync() { IsBusy = true; diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/CatalogView.xaml.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/CatalogView.xaml.cs index ce2b888ad..36442062d 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/CatalogView.xaml.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/CatalogView.xaml.cs @@ -8,14 +8,12 @@ namespace eShopOnContainers.Core.Views { public partial class CatalogView : ContentPage, IMenuContainerPage { - private FiltersView _filterView; + private FiltersView _filterView = new FiltersView(); public CatalogView() { InitializeComponent(); - _filterView = new FiltersView(); - SlideMenu = _filterView; MessagingCenter.Subscribe(this, MessengerKeys.Filter, (sender) => @@ -42,13 +40,11 @@ namespace eShopOnContainers.Core.Views set; } - protected override void OnBindingContextChanged() { base.OnBindingContextChanged(); - if (_filterView != null) - _filterView.BindingContext = BindingContext; + _filterView.BindingContext = BindingContext; } private void OnFilterChanged(object sender, EventArgs e) From efa81cf842a98a06a1c2dbf79f82a329105d5f9e Mon Sep 17 00:00:00 2001 From: David Britch Date: Mon, 20 Mar 2017 16:31:35 +0000 Subject: [PATCH 03/29] ViewModelLocator is now responsible for connecting view models to views. Uses an auto-wiring convention-based approach. --- .../eShopOnContainers.Core/App.xaml.cs | 8 +- .../Helpers/ServicesHelper.cs | 6 +- .../Helpers/Settings.cs | 4 +- .../Services/Navigation/INavigationService.cs | 2 +- .../Services/Navigation/NavigationService.cs | 74 +++----- .../Validations/ValidatableObject.cs | 2 +- .../ViewModels/Base/ExtendedBindableObject.cs | 2 +- .../ViewModels/Base/ViewModelBase.cs | 9 +- .../ViewModels/Base/ViewModelLocator.cs | 164 +++++++++--------- .../ViewModels/BasketViewModel.cs | 2 - .../ViewModels/CatalogViewModel.cs | 5 +- .../ViewModels/CheckoutViewModel.cs | 4 +- .../ViewModels/LoginViewModel.cs | 2 +- .../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/CheckoutView.xaml | 8 +- .../Views/LoginView.xaml | 4 +- .../Views/MainView.xaml | 6 +- .../Views/MainView.xaml.cs | 15 +- .../Views/OrderDetailView.xaml | 6 +- .../Views/ProfileView.xaml | 10 +- .../Views/SettingsView.xaml | 8 +- 26 files changed, 171 insertions(+), 194 deletions(-) diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/App.xaml.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/App.xaml.cs index 2c5a73cfb..f9c43afc0 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; @@ -27,13 +27,13 @@ namespace eShopOnContainers private void InitApp() { 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..38cdaee8d 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,8 +12,6 @@ namespace eShopOnContainers.Services { public class NavigationService : INavigationService { - protected readonly Dictionary _mappings; - 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); @@ -123,42 +114,25 @@ namespace eShopOnContainers.Services await (page.BindingContext as ViewModelBase).InitializeAsync(parameter); } - protected Type GetPageTypeForViewModel(Type viewModelType) - { - if (!_mappings.ContainsKey(viewModelType)) - { - throw new KeyNotFoundException($"No map for ${viewModelType} was found on navigation mappings"); - } - - return _mappings[viewModelType]; - } - - protected Page CreateAndBindPage(Type viewModelType, object parameter) - { - Type pageType = GetPageTypeForViewModel(viewModelType); - - if (pageType == null) - { - throw new Exception($"Mapping type for {viewModelType} is not a page"); - } - - 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)); - } + protected Type GetPageTypeForViewModel(Type 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 CreatePage(Type viewModelType, object parameter) + { + Type pageType = GetPageTypeForViewModel(viewModelType); + if (pageType == null) + { + throw new Exception($"Cannot locate page type for {viewModelType}"); + } + + Page page = Activator.CreateInstance(pageType) as Page; + return page; + } } } \ 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..cd36fb3cc 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,8 +27,8 @@ 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; } diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/Base/ViewModelLocator.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/Base/ViewModelLocator.cs index 82145d466..c9e253a2e 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,100 +10,101 @@ 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 static bool GetAutoWireViewModel(BindableObject bindable) + { + return (bool)bindable.GetValue(ViewModelLocator.AutoWireViewModelProperty); + } - public bool UseMockService - { - get { return _useMockService; } - set { _useMockService = value; ; } - } + public static void SetAutoWireViewModel(BindableObject bindable, bool value) + { + bindable.SetValue(ViewModelLocator.AutoWireViewModelProperty, value); + } - protected ViewModelLocator() - { - _unityContainer = new UnityContainer(); + public static bool UseMockService { get; set; } - // Services - _unityContainer.RegisterType(); - RegisterSingleton(); - _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(); - _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 static void UpdateDependencies(bool useMockServices) + { + // Change injected dependencies + if (useMockServices) + { + _unityContainer.RegisterInstance(new CatalogMockService()); + _unityContainer.RegisterInstance(new BasketMockService()); + _unityContainer.RegisterInstance(new OrderMockService()); + _unityContainer.RegisterInstance(new UserMockService()); - public void UpdateDependencies(bool useMockServices) - { - // Change injected dependencies - if (useMockServices) - { - _unityContainer.RegisterInstance(new CatalogMockService()); - _unityContainer.RegisterInstance(new BasketMockService()); - _unityContainer.RegisterInstance(new OrderMockService()); - _unityContainer.RegisterInstance(new UserMockService()); + UseMockService = true; + } + else + { + var requestProvider = Resolve(); + _unityContainer.RegisterInstance(new CatalogService(requestProvider)); + _unityContainer.RegisterInstance(new BasketService(requestProvider)); + _unityContainer.RegisterInstance(new OrderService(requestProvider)); + _unityContainer.RegisterInstance(new UserService(requestProvider)); - UseMockService = true; - } - else - { - var requestProvider = Resolve(); - _unityContainer.RegisterInstance(new CatalogService(requestProvider)); - _unityContainer.RegisterInstance(new BasketService(requestProvider)); - _unityContainer.RegisterInstance(new OrderService(requestProvider)); - _unityContainer.RegisterInstance(new UserService(requestProvider)); + UseMockService = false; + } + } - UseMockService = false; - } - } - - public T Resolve() - { - return _unityContainer.Resolve(); - } + public static T Resolve() + { + return _unityContainer.Resolve(); + } - public object Resolve(Type type) - { - return _unityContainer.Resolve(type); - } + private static void OnAutoWireViewModelChanged(BindableObject bindable, object oldValue, object newValue) + { + var view = bindable as Element; + if (view == null) + { + return; + } - public void Register(T instance) - { - _unityContainer.RegisterInstance(instance); - } + 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 Register() where T : TInterface - { - _unityContainer.RegisterType(); - } - - 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 1a0c6f740..e546c4592 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 a2b8501ae..82767e9d7 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..98c6d9222 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; 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..012357ec1 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/BasketView.xaml +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/BasketView.xaml @@ -1,10 +1,12 @@ + viewModelBase:ViewModelLocator.AutoWireViewModel="true" + Title="Cart"> diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/CatalogView.xaml b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/CatalogView.xaml index 870980ac2..d62ca11fc 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/CheckoutView.xaml b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/CheckoutView.xaml index 921d739f3..fe1843d35 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..b8ac57399 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..63a46965e 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..91165559c 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/ProfileView.xaml +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/ProfileView.xaml @@ -1,10 +1,12 @@ - + 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 @@ - + From 33009ceb33f03084ad078ebfd8a03fe899c1ce1c Mon Sep 17 00:00:00 2001 From: David Britch Date: Mon, 20 Mar 2017 16:36:38 +0000 Subject: [PATCH 04/29] Renamed MessengerKeys class to MessageKeys. --- .../ViewModels/Base/{MessengerKeys.cs => MessageKeys.cs} | 2 +- .../eShopOnContainers.Core/ViewModels/BasketViewModel.cs | 4 ++-- .../eShopOnContainers.Core/ViewModels/CatalogViewModel.cs | 4 ++-- .../eShopOnContainers.Core/ViewModels/MainViewModel.cs | 2 +- .../eShopOnContainers.Core/Views/CatalogView.xaml.cs | 2 +- .../eShopOnContainers.Core/Views/MainView.xaml.cs | 2 +- .../eShopOnContainers.Core/eShopOnContainers.Core.csproj | 2 +- 7 files changed, 9 insertions(+), 9 deletions(-) rename src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/Base/{MessengerKeys.cs => MessageKeys.cs} (91%) diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/Base/MessengerKeys.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/Base/MessageKeys.cs similarity index 91% rename from src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/Base/MessengerKeys.cs rename to src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/Base/MessageKeys.cs index 38b8f28f1..c968ff21f 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/Base/MessengerKeys.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/Base/MessageKeys.cs @@ -1,6 +1,6 @@ namespace eShopOnContainers.Core.ViewModels.Base { - public class MessengerKeys + public class MessageKeys { // Add product to basket public const string AddProduct = "AddProduct"; diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/BasketViewModel.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/BasketViewModel.cs index e546c4592..ff56a56d0 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/BasketViewModel.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/BasketViewModel.cs @@ -84,8 +84,8 @@ namespace eShopOnContainers.Core.ViewModels } } - MessagingCenter.Unsubscribe(this, MessengerKeys.AddProduct); - MessagingCenter.Subscribe(this, MessengerKeys.AddProduct, async (sender, arg) => + MessagingCenter.Unsubscribe(this, MessageKeys.AddProduct); + MessagingCenter.Subscribe(this, MessageKeys.AddProduct, async (sender, arg) => { BadgeCount++; diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CatalogViewModel.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CatalogViewModel.cs index 82767e9d7..86c6d5369 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CatalogViewModel.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CatalogViewModel.cs @@ -107,7 +107,7 @@ namespace eShopOnContainers.Core.ViewModels private void AddCatalogItem(CatalogItem catalogItem) { // Add new item to Basket - MessagingCenter.Send(this, MessengerKeys.AddProduct, catalogItem); + MessagingCenter.Send(this, MessageKeys.AddProduct, catalogItem); } private async Task FilterAsync() @@ -120,7 +120,7 @@ namespace eShopOnContainers.Core.ViewModels IsBusy = true; // Filter catalog products - MessagingCenter.Send(this, MessengerKeys.Filter); + MessagingCenter.Send(this, MessageKeys.Filter); Products = await _productsService.FilterAsync(Brand.Id, Type.Id); IsBusy = false; diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/MainViewModel.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/MainViewModel.cs index eebc17e35..a1c9352de 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/MainViewModel.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/MainViewModel.cs @@ -19,7 +19,7 @@ namespace eShopOnContainers.Core.ViewModels { // Change selected application tab var tabIndex = ((TabParameter)navigationData).TabIndex; - MessagingCenter.Send(this, MessengerKeys.ChangeTab, tabIndex); + MessagingCenter.Send(this, MessageKeys.ChangeTab, tabIndex); } return base.InitializeAsync(navigationData); diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/CatalogView.xaml.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/CatalogView.xaml.cs index 36442062d..792b93b5c 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/CatalogView.xaml.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/CatalogView.xaml.cs @@ -16,7 +16,7 @@ namespace eShopOnContainers.Core.Views SlideMenu = _filterView; - MessagingCenter.Subscribe(this, MessengerKeys.Filter, (sender) => + MessagingCenter.Subscribe(this, MessageKeys.Filter, (sender) => { Filter(); }); diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/MainView.xaml.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/MainView.xaml.cs index 773262d99..8ec44bc3e 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/MainView.xaml.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/MainView.xaml.cs @@ -15,7 +15,7 @@ namespace eShopOnContainers.Core.Views { base.OnAppearing(); - MessagingCenter.Subscribe(this, MessengerKeys.ChangeTab, (sender, arg) => + MessagingCenter.Subscribe(this, MessageKeys.ChangeTab, (sender, arg) => { switch(arg) { diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/eShopOnContainers.Core.csproj b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/eShopOnContainers.Core.csproj index 4a898b528..e16b9c963 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/eShopOnContainers.Core.csproj +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/eShopOnContainers.Core.csproj @@ -110,7 +110,7 @@ - + From 4a073b96d860520d3da1f455c4b89fcc9a26a860 Mon Sep 17 00:00:00 2001 From: David Britch Date: Mon, 20 Mar 2017 16:58:37 +0000 Subject: [PATCH 05/29] Removed unused code from NavigationService. --- .../Services/Navigation/INavigationService.cs | 7 --- .../Services/Navigation/NavigationService.cs | 53 ++++--------------- .../ViewModels/MainViewModel.cs | 1 - 3 files changed, 11 insertions(+), 50 deletions(-) diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Navigation/INavigationService.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Navigation/INavigationService.cs index 64ef7d807..6a1bbcf6d 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Navigation/INavigationService.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Navigation/INavigationService.cs @@ -1,5 +1,4 @@ using eShopOnContainers.Core.ViewModels.Base; -using System; using System.Threading.Tasks; namespace eShopOnContainers.Services @@ -12,12 +11,6 @@ namespace eShopOnContainers.Services Task NavigateToAsync(object parameter) where TViewModel : ViewModelBase; - Task NavigateToAsync(Type viewModelType); - - Task NavigateToAsync(Type viewModelType, object parameter); - - Task NavigateBackAsync(); - Task RemoveLastFromBackStackAsync(); Task RemoveBackStackAsync(); diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Navigation/NavigationService.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Navigation/NavigationService.cs index 38cdaee8d..4a6c0ef6c 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Navigation/NavigationService.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Navigation/NavigationService.cs @@ -12,14 +12,6 @@ namespace eShopOnContainers.Services { public class NavigationService : INavigationService { - protected Application CurrentApplication - { - get - { - return Application.Current; - } - } - public Task InitializeAsync() { if(string.IsNullOrEmpty(Settings.AuthAccessToken)) @@ -38,32 +30,9 @@ namespace eShopOnContainers.Services return InternalNavigateToAsync(typeof(TViewModel), parameter); } - public Task NavigateToAsync(Type viewModelType) - { - return InternalNavigateToAsync(viewModelType, null); - } - - public Task NavigateToAsync(Type viewModelType, object parameter) - { - return InternalNavigateToAsync(viewModelType, parameter); - } - - public async Task NavigateBackAsync() - { - if (CurrentApplication.MainPage is CatalogView) - { - var mainPage = CurrentApplication.MainPage as CatalogView; - await mainPage.Navigation.PopAsync(); - } - else if (CurrentApplication.MainPage != null) - { - await CurrentApplication.MainPage.Navigation.PopAsync(); - } - } - - public virtual Task RemoveLastFromBackStackAsync() + public Task RemoveLastFromBackStackAsync() { - var mainPage = CurrentApplication.MainPage as CustomNavigationView; + var mainPage = Application.Current.MainPage as CustomNavigationView; if (mainPage != null) { @@ -74,9 +43,9 @@ namespace eShopOnContainers.Services return Task.FromResult(true); } - public virtual Task RemoveBackStackAsync() + public Task RemoveBackStackAsync() { - var mainPage = CurrentApplication.MainPage as CustomNavigationView; + var mainPage = Application.Current.MainPage as CustomNavigationView; if (mainPage != null) { @@ -90,31 +59,31 @@ namespace eShopOnContainers.Services return Task.FromResult(true); } - protected virtual async Task InternalNavigateToAsync(Type viewModelType, object parameter) + private async Task InternalNavigateToAsync(Type viewModelType, object parameter) { Page page = CreatePage(viewModelType, parameter); if (page is LoginView) { - CurrentApplication.MainPage = new CustomNavigationView(page); + Application.Current.MainPage = new CustomNavigationView(page); } else - { - var navigationPage = CurrentApplication.MainPage as CustomNavigationView; + { + var navigationPage = Application.Current.MainPage as CustomNavigationView; if (navigationPage != null) { await navigationPage.PushAsync(page); } else { - CurrentApplication.MainPage = new CustomNavigationView(page); + Application.Current.MainPage = new CustomNavigationView(page); } } await (page.BindingContext as ViewModelBase).InitializeAsync(parameter); } - protected Type GetPageTypeForViewModel(Type viewModelType) + private Type GetPageTypeForViewModel(Type viewModelType) { var viewName = viewModelType.FullName.Replace("Model", string.Empty); var viewModelAssemblyName = viewModelType.GetTypeInfo().Assembly.FullName; @@ -123,7 +92,7 @@ namespace eShopOnContainers.Services return viewType; } - protected Page CreatePage(Type viewModelType, object parameter) + private Page CreatePage(Type viewModelType, object parameter) { Type pageType = GetPageTypeForViewModel(viewModelType); if (pageType == null) diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/MainViewModel.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/MainViewModel.cs index a1c9352de..592d6b831 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/MainViewModel.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/MainViewModel.cs @@ -2,7 +2,6 @@ using eShopOnContainers.Core.ViewModels.Base; using eShopOnContainers.Core.Models.Navigation; using Xamarin.Forms; -using eShopOnContainers.Core.ViewModels.Base; using System.Windows.Input; namespace eShopOnContainers.Core.ViewModels From 531e90e5a3db4e5f07fb0704110e46883c3324f9 Mon Sep 17 00:00:00 2001 From: David Britch Date: Mon, 20 Mar 2017 17:05:35 +0000 Subject: [PATCH 06/29] Removed unused services from view models. --- .../ViewModels/CatalogViewModel.cs | 10 +--------- .../ViewModels/LoginViewModel.cs | 5 +---- .../ViewModels/OrderDetailViewModel.cs | 9 +-------- 3 files changed, 3 insertions(+), 21 deletions(-) diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CatalogViewModel.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CatalogViewModel.cs index 86c6d5369..554c49852 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CatalogViewModel.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CatalogViewModel.cs @@ -17,19 +17,11 @@ namespace eShopOnContainers.Core.ViewModels private CatalogBrand _brand; private ObservableCollection _types; private CatalogType _type; - - private IBasketService _basketService; private ICatalogService _productsService; - private IUserService _userService; - public CatalogViewModel( - IBasketService basketService, - ICatalogService productsService, - IUserService userService) + public CatalogViewModel(ICatalogService productsService) { - _basketService = basketService; _productsService = productsService; - _userService = userService; } public ObservableCollection Products diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/LoginViewModel.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/LoginViewModel.cs index 98c6d9222..28031dfa3 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/LoginViewModel.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/LoginViewModel.cs @@ -25,16 +25,13 @@ namespace eShopOnContainers.Core.ViewModels private IOpenUrlService _openUrlService; private IIdentityService _identityService; - private IUserService _userService; public LoginViewModel( IOpenUrlService openUrlService, - IIdentityService identityService, - IUserService userService) + IIdentityService identityService) { _openUrlService = openUrlService; _identityService = identityService; - _userService = userService; _userName = new ValidatableObject(); _password = new ValidatableObject(); diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/OrderDetailViewModel.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/OrderDetailViewModel.cs index 86b5a906a..449c6ea98 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/OrderDetailViewModel.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/OrderDetailViewModel.cs @@ -13,17 +13,10 @@ namespace eShopOnContainers.Core.ViewModels { private Order _order; - private IBasketService _orderService; - private ICatalogService _catalogService; private IOrderService _ordersService; - public OrderDetailViewModel( - IBasketService orderService, - ICatalogService catalogService, - IOrderService ordersService) + public OrderDetailViewModel(IOrderService ordersService) { - _orderService = orderService; - _catalogService = catalogService; _ordersService = ordersService; } From 433de15fdca3404968f9a63781e36fb52433b814 Mon Sep 17 00:00:00 2001 From: David Britch Date: Mon, 20 Mar 2017 17:16:42 +0000 Subject: [PATCH 07/29] Unused x:Name references removed. --- .../eShopOnContainers.Core/Views/CheckoutView.xaml | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/CheckoutView.xaml b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/CheckoutView.xaml index fe1843d35..ec6ea70d5 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/CheckoutView.xaml +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/CheckoutView.xaml @@ -84,8 +84,7 @@ - + @@ -141,8 +140,7 @@ @@ -169,9 +167,7 @@ - + From 703d87eaefecd71009697314ab30945e6e490245 Mon Sep 17 00:00:00 2001 From: David Britch Date: Fri, 24 Mar 2017 14:49:06 +0000 Subject: [PATCH 08/29] LoginView displays validation errors when using mock services. --- .../eShopOnContainers.Core/App.xaml | 10 +++++ .../FirstValidationErrorConverter.cs | 22 ++++++++++ .../Validations/ValidatableObject.cs | 27 ++++++------ .../ViewModels/LoginViewModel.cs | 23 +++++++--- .../Views/LoginView.xaml | 43 ++++++++++++++++--- .../eShopOnContainers.Core.csproj | 1 + 6 files changed, 103 insertions(+), 23 deletions(-) create mode 100644 src/Mobile/eShopOnContainers/eShopOnContainers.Core/Converters/FirstValidationErrorConverter.cs diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/App.xaml b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/App.xaml index b1ed2ea4f..64ff39628 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/App.xaml +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/App.xaml @@ -17,6 +17,7 @@ #00A69C #00857D #e2e2e2 + #ff5252 + @@ -109,6 +111,14 @@ + +