using GalaSoft.MvvmLight.Messaging; using LBAContractRegister.Messages; using LBAContractRegister.Models; using LBAContractRegister.ViewModels.RowVM; using System; using System.Collections.ObjectModel; using System.Data.Entity; using System.Linq; using System.Windows; using System.Windows.Threading; namespace LBAContractRegister.ViewModels.Lists { public class TypeListViewModel : CrudVMBase { private TypeVM _selectedtype; public TypeVM SelectedType { get { return _selectedtype; } set { _selectedtype = value; _selectedentity = value; OnPropertyChanged(); } } private TypeVM _editvm; public TypeVM EditVM { get { return _editvm; } set { _editvm = value; _editentity = _editvm.TheEntity; OnPropertyChanged(); } } public ObservableCollection Types { get; set; } protected async override void GetData() { ThrobberVisible = Visibility.Visible; ObservableCollection _Types = new ObservableCollection(); var types = await (from p in db.Types orderby p.Type1 select p).ToListAsync(); foreach (Models.Type type in types) { _Types.Add(new TypeVM { IsNew = false, TheEntity = type }); } Types = _Types; OnPropertyChanged("Types"); FillRetentions(); ThrobberVisible = Visibility.Collapsed; } private async void FillRetentions() { var q = await (from a in db.Retentions select a).ToListAsync(); _retentions = new ObservableCollection(q); } private ObservableCollection _retentions; public ObservableCollection Retentions { get { return _retentions; } set { _retentions = value; OnPropertyChanged("Retentions"); } } protected override void EditCurrent() { EditVM = SelectedType; IsInEditMode = true; } protected override void InsertNew() { EditVM = new TypeVM(); IsInEditMode = true; } protected override void CommitUpdates() { UserMessage msg = new UserMessage(); if (EditVM.TheEntity.IsValid()) { if (EditVM.IsNew) { EditVM.IsNew = false; Types.Add(EditVM); db.Types.Add(EditVM.TheEntity); UpdateDB(); } else if (db.ChangeTracker.HasChanges()) { UpdateDB(); } else { } ShowUserMessage("No changes to save"); } else { ShowUserMessage("Problems with the data"); } } private async void UpdateDB() { CommandMessage Message = new CommandMessage { Command = Messages.CommandType.FillTypes }; try { await db.SaveChangesAsync(); ShowUserMessage("Database Updated"); OnPropertyChanged("Types"); Messenger.Default.Send(Message); } catch (Exception e) { if (System.Diagnostics.Debugger.IsAttached) { ErrorMessage = e.InnerException.GetBaseException().ToString(); } ShowUserMessage("Cannot update the database"); } ReFocusRow(); } protected override void Quit() { if (EditVM != null) { if (!EditVM.IsNew) { ReFocusRow(); } } } protected async void ReFocusRow(bool withReload = true) { int id = EditVM.TheEntity.IDType; SelectedType = null; await db.Entry(EditVM.TheEntity).ReloadAsync(); await Application.Current.Dispatcher.InvokeAsync(new Action(() => { SelectedType = Types.Where(e => e.TheEntity.IDType == id).FirstOrDefault(); SelectedType.TheEntity = SelectedType.TheEntity; SelectedType.TheEntity.ClearErrors(); }), DispatcherPriority.ContextIdle); IsInEditMode = false; } protected override async void DeleteCurrent() { UserMessage msg = new UserMessage(); if (SelectedType != null) { CommandMessage Message = new CommandMessage { Command = Messages.CommandType.FillTypes }; MessageBoxResult msgresult = MessageBox.Show("Are you sure you want to delete? If not you can cancel and press the Refresh button to undo.", "Delete Data", MessageBoxButton.YesNo, MessageBoxImage.Warning); if (msgresult == MessageBoxResult.Yes) { try { db.Types.Remove(SelectedType.TheEntity); Types.Remove(SelectedType); await db.SaveChangesAsync(); ShowUserMessage("Deleted"); OnPropertyChanged("Types"); Messenger.Default.Send(Message); } catch (Exception ) { ShowUserMessage("Could not delete. Make sure its not in use"); GetData(); } } } else { msg.Message = "Nothing selected to delete"; Messenger.Default.Send(msg); } } public TypeListViewModel() : base() { } } }