public ViewToViewModel(UserControl control, IBaseViewModel type, MyContentRegion region, params object[] args) { View = control; ViewModel = type; Region = region; if (args != null) { Args = args; } }
public void ClearHistory(string regionName) { if (ConfigurationManager.AppSettings["disable_views"] != null) { if (!Regions.ContainsKey(regionName)) { Regions[regionName] = new MyContentRegion(); RegionHistory[regionName] = new List <ViewToViewModel>(); } } if (Regions.ContainsKey(regionName)) { RegionHistory[regionName].Clear(); } else { throw new Exception("Invalid region name."); } }
public T NavigateUsingViewModel <T>(string regionName, params object[] args) { if (ConfigurationManager.AppSettings["disable_views"] != null) { if (!Regions.ContainsKey(regionName)) { Regions[regionName] = new MyContentRegion(); RegionHistory[regionName] = new List <ViewToViewModel>(); } } T returnValue = default(T); if (Regions.ContainsKey(regionName)) { Dispatcher.Invoke(() => { try { var region = Regions[regionName]; ClearForwardHistory(regionName); var modelName = typeof(T).Name; if (region.ChildRegions.ContainsKey(modelName)) { foreach (var childRegion in region.ChildRegions.Values) { childRegion.Close(); } region.Visibility = Visibility.Collapsed; var oldControl = (UserControl)region.Content; if (oldControl != null) { var baseViewModel = oldControl.DataContext as IBaseViewModel; if (baseViewModel != null) { oldControl.DataContext = null; baseViewModel.Close(); } } foreach (var childRegion in region.ChildRegions.Values) { if (childRegion.VirtualRegionName == modelName) { childRegion.Visibility = Visibility.Visible; if (childRegion.Content != null && ((UserControl)childRegion.Content).DataContext.GetType().Name == modelName) { var baseViewModel = ((UserControl)childRegion.Content).DataContext as IBaseViewModel; if (baseViewModel != null) { baseViewModel.OnNavigationCompleted(); returnValue = (T)baseViewModel; var vievToViewModel = new ViewToViewModel((UserControl)childRegion.Content, baseViewModel, childRegion, args); RegionHistory[regionName].Add(vievToViewModel); RegionToViewModel[regionName] = vievToViewModel; } } else { var control = FindViewByViewModel <T>(); var viewModel = Activator.CreateInstance(typeof(T), args); childRegion.Content = control; control.DataContext = viewModel; returnValue = (T)viewModel; if (viewModel is IBaseViewModel) { ((IBaseViewModel)viewModel).View = control; } var vievToViewModel = new ViewToViewModel(control, (IBaseViewModel)viewModel, childRegion, args); RegionHistory[regionName].Add(vievToViewModel); RegionToViewModel[regionName] = vievToViewModel; } } else { childRegion.Close(); } } } else { foreach (var childRegion in region.ChildRegions.Values) { childRegion.Close(); } var oldControl = (UserControl)region.Content; if (oldControl != null) { var baseViewModel = oldControl.DataContext as IBaseViewModel; if (baseViewModel != null) { oldControl.DataContext = null; baseViewModel.Close(); } } region.Visibility = Visibility.Visible; var control = FindViewByViewModel <T>(); var viewModel = Activator.CreateInstance(typeof(T), args); region.Content = control; control.DataContext = viewModel; returnValue = (T)viewModel; if (viewModel is IBaseViewModel) { ((IBaseViewModel)viewModel).View = control; } var vievToViewModel = new ViewToViewModel(control, (IBaseViewModel)viewModel, region, args); RegionHistory[regionName].Add(vievToViewModel); RegionToViewModel[regionName] = vievToViewModel; } } catch (Exception ex) { Log.Error(ex.Message, ex); } }); } else { throw new Exception("Invalid region name."); } return(returnValue); }