private async void OnOpenDetailView(OpenDetailViewEventArgs args) { var detailViewModel = DetailViewModels.SingleOrDefault(vm => vm.Id == args.Id && vm.GetType().Name == args.ViewModelName); if (detailViewModel == null) { detailViewModel = _detailViewModelCreator[args.ViewModelName]; try { await detailViewModel.LoadAsync(args.Id); } catch { await _messageDialogService.ShowInfoAsync("Could not load entity, " + "maybe it was deleted in the meantime by another user, " + "Navigation will be refreshed for you."); await NavigationViewModel.LoadAsync(); return; } DetailViewModels.Add(detailViewModel); } SelectedDetailViewModel = detailViewModel; }
protected async Task SaveWithOptimistcConcurencyAsync(Func <Task> saveFunc, Action afterSaveAction) { try { await saveFunc(); } catch (DbUpdateConcurrencyException ex) { var databaseValues = ex.Entries.Single().GetDatabaseValues(); if (databaseValues == null) { await MessageDialogService.ShowInfoAsync("The entity has been deleted by someone else"); RaiseDetailDeletedEvent(Id); return; } var result = await MessageDialogService.ShowOkCancelDialogAsync("The entity has been changed in" + "the meantime by someone else. Click Ok to save your changes anyway, orclick Cancel " + "to reload entity from database", "Question"); if (result == MessageDialogResult.OK) { //Update Original values with database values var entry = ex.Entries.Single(); entry.OriginalValues.SetValues(entry.GetDatabaseValues()); await saveFunc(); } else { await ex.Entries.Single().ReloadAsync(); await LoadAsync(Id); } } afterSaveAction(); }