private static RestoredViewModel GetOrAddRestoredViewModel(Guid id) { lock (RestoredViewModels) { RestoredViewModel value; if (!RestoredViewModels.TryGetValue(id, out value)) { value = new RestoredViewModel(); RestoredViewModels[id] = value; } return(value); } }
public IViewModel RestoreViewModel(IDataContext viewModelState, IDataContext dataContext, bool throwOnError) { try { dataContext = dataContext.ToNonReadOnly(); if (viewModelState == null) { viewModelState = DataContext.Empty; } else { dataContext.Merge(viewModelState); } IViewModel viewModel; if (!dataContext.GetData(InitializationConstants.IgnoreViewModelCache)) { Guid id; if (viewModelState.TryGetData(IdViewModelConstant, out id)) { viewModel = GetOrAddRestoredViewModel(id).GetViewModel(); if (viewModel != null) { return(viewModel); } } } RestoredViewModel restoredParentViewModel = null; IViewModel parentViewModel = null; Guid idParent; if (viewModelState.TryGetData(IdParentViewModelConstant, out idParent)) { restoredParentViewModel = GetOrAddRestoredViewModel(idParent); parentViewModel = restoredParentViewModel.GetViewModel(); if (parentViewModel != null) { dataContext.AddOrUpdate(InitializationConstants.ParentViewModel, parentViewModel); } } var restoring = Restoring; if (restoring != null) { var args = new ViewModelRestoringEventArgs { Context = dataContext, ViewModelState = viewModelState }; restoring(this, args); dataContext = args.Context ?? DataContext.Empty; } viewModel = RestoreViewModelInternal(viewModelState, dataContext); if (viewModel != null) { if (restoredParentViewModel != null && parentViewModel == null) { restoredParentViewModel.AddChildViewModel(viewModel); } OnViewModelRestored(viewModel, viewModelState, dataContext); var restored = Restored; if (restored != null) { var args = new ViewModelRestoredEventArgs(viewModel) { Context = dataContext, ViewModelState = viewModelState }; restored(this, args); } Tracer.TraceViewModel(AuditAction.Restored, viewModel); if (ReferenceEquals(viewModelState, DataContext.Empty)) { Tracer.Warn("The view model '{0}' was restored without state.", viewModel); } return(viewModel); } if (throwOnError) { throw ExceptionManager.ViewModelCannotBeRestored(); } } catch (Exception e) { if (throwOnError) { throw; } Tracer.Warn(e.Flatten(true)); } return(null); }
private static RestoredViewModel GetOrAddRestoredViewModel(Guid id) { lock (RestoredViewModels) { RestoredViewModel value; if (!RestoredViewModels.TryGetValue(id, out value)) { value = new RestoredViewModel(); RestoredViewModels[id] = value; } return value; } }