private static UiViewModelBase CreateViewModel(ChangeDisplayEventArgs changeDisplayEventArgs, Dictionary <Type, Type> dictionary, Type viewModelInterface) { UiViewModelBase viewModel; if (dictionary.ContainsKey(viewModelInterface)) { viewModel = (UiViewModelBase)Activator.CreateInstance(dictionary[changeDisplayEventArgs.ViewModelInterface]); viewModel.DisposeOfAfterUse = changeDisplayEventArgs.CreateNew; } else { var names = Assembly.GetExecutingAssembly().GetTypes().Select(i => i.Name); #if DEBUG var countOfClasses = GetDerivedForInterfaceType(viewModelInterface).Count(); if (countOfClasses == 0) { throw new Exception($"Could not find a class that is derived from the interface {viewModelInterface.Name}"); } else if (countOfClasses > 1) { var classes = string.Join(", ", GetDerivedForInterfaceType(viewModelInterface).Select(i => i.Name)); throw new Exception($"Multiple classes found derived from the interface {viewModelInterface.Name}: {classes}"); } #endif var displayViewModelClass = GetDerivedForInterfaceType(viewModelInterface).FirstOrDefault(); viewModel = (UiViewModelBase)Activator.CreateInstance(displayViewModelClass); ChangeDisplayEventArgs.InterfaceTypeDictionary.Add(viewModelInterface, displayViewModelClass); viewModel.DisposeOfAfterUse = changeDisplayEventArgs.CreateNew; } return(viewModel); }
private void DisplayChangeEventHandler(object sender, ChangeDisplayEventArgs changeDisplayEventArgs) { //Should not be keeping (or using) previous display and disposing switch (changeDisplayEventArgs.DisplayActionType) { case DisplayActionTypes.PopPreviousDisplay: PrimaryViewModel = _primaryDisplayStack.Pop(); return; case DisplayActionTypes.PushPreviousDisplay: _primaryDisplayStack.Push(PrimaryViewModel); break; } if (PrimaryViewModel.DisposeOfAfterUse && !(changeDisplayEventArgs.DisplayActionType == DisplayActionTypes.PushPreviousDisplay)) { PrimaryViewModel.Cleanup(); } PrimaryViewModel = changeDisplayEventArgs.ViewModel(); }
public static UiViewModelBase ViewModel(this ChangeDisplayEventArgs changeDisplayEventArgs) { UiViewModelBase viewModel; var viewModelInterface = changeDisplayEventArgs.ViewModelInterface; var dictionary = ChangeDisplayEventArgs.InterfaceTypeDictionary; if (changeDisplayEventArgs.CreateNew) { viewModel = CreateViewModel(changeDisplayEventArgs, dictionary, viewModelInterface); } else if (ClassLocator.ContainsCreated(changeDisplayEventArgs.ViewModelInterface)) { viewModel = (UiViewModelBase)ClassLocator.GetInstance(changeDisplayEventArgs.ViewModelInterface); } else { viewModel = CreateViewModel(changeDisplayEventArgs, dictionary, viewModelInterface); ClassLocator.Register(() => viewModel); } return(viewModel); }