using System; using System.Collections.ObjectModel; using System.Collections.Generic; using System.Linq; using Aurora.Design.Components.NavigationMenu; using Aurora.Design.Views.MainView; using Xamarin.Forms; using Xamarin.Forms.Xaml; namespace Aurora.Design.Views.Main { [XamlCompilation(XamlCompilationOptions.Compile)] public partial class MainView : MasterDetailPage { private Dictionary _viewModels; private BaseViewModel _lastViewModel; public MainView() { InitializeComponent(); BindingContext = new MainViewModel(); _viewModels = new Dictionary(); MasterPage.ListView.ItemSelected += ListView_ItemSelected; Appearing += OnAppearing; } ~MainView() { Appearing -= OnAppearing; } private void ListView_ItemSelected(object sender, SelectedItemChangedEventArgs e) { var item = e.SelectedItem as NavigationItem; if (item == null) return; var view = (View)Activator.CreateInstance(item.TargetType); //Check if we have an instantiated viewModel BaseViewModel vm = new BaseViewModel(); if (_viewModels.ContainsKey(item.Id)) { _viewModels.TryGetValue(item.Id, out vm); } else { if (item.TargetViewModelType.BaseType != typeof(BaseViewModel)) { throw new InvalidOperationException("TargetViewModel field must be of type BaseViewModel"); } //Instantiate new view model vm = (BaseViewModel)Activator.CreateInstance(item.TargetViewModelType); _viewModels.Add(item.Id, vm); } //Activate viewmodel vm.OnActive(); //Deactivate last viewModel _lastViewModel.OnInactive(); //Assign viewModel _lastViewModel = vm; view.BindingContext = vm; ContentPresenter viewContent = (ContentPresenter)ContentPage.Content.FindByName("ViewContent"); viewContent.Content = view; MasterPage.ListView.SelectedItem = null; } /// /// Event handler for page appearing. /// /// The object that fired the event. /// The event arguments private void OnAppearing(object sender, EventArgs args) { //Set initial view from first item in list ObservableCollection screenList = (ObservableCollection)MasterPage.ListView.ItemsSource; //Assign viewModel NavigationItem firstNavItem = screenList.FirstOrDefault().FirstOrDefault(); var view = (View)Activator.CreateInstance(firstNavItem.TargetType); BaseViewModel vm = new BaseViewModel(); if (_viewModels.ContainsKey(firstNavItem.Id)) { _viewModels.TryGetValue(firstNavItem.Id, out vm); } else { //Instantiate new view model vm = (BaseViewModel)Activator.CreateInstance(firstNavItem.TargetViewModelType); _viewModels.Add(firstNavItem.Id, vm); } view.BindingContext = vm; _lastViewModel = vm; vm.OnActive(); ContentPresenter viewContent = (ContentPresenter)ContentPage.Content.FindByName("ViewContent"); viewContent.Content = view; MasterPage.ListView.SelectedItem = screenList.FirstOrDefault(); } } }