public MainViewModel()
        {
            Application.Current.MainWindow.Closing += MainWindow_Closing;
            Application.Current.MainWindow.Closed += MainWindow_Closed;

            try
            {
                _ctx = new UnitOfWork(new IsisContext());
                Workspaces = new ObservableCollection<WorkspaceViewModel>
                {
                    new BerekenModuleViewModel(_ctx),
                    new PrestatieBeheerViewModel(_ctx),
                    new KlantenBeheerViewModel(_ctx),
                    new PersoneelBeheerViewModel(_ctx),
                    new ParameterBeheerViewModel(_ctx)
                };
                SelectedWorkspace = Workspaces.First();
            }
            catch (Exception ex)
            {
                MessageBoxService messageService = new MessageBoxService();
                messageService.ShowMessageBox("ERROR");      //Hack: The first Messagebox closes automatically
                //TODO: Add possiblity to restore database from backup!
                messageService.ShowErrorBox("Er heeft zich een probleem voorgedaan bij het ophalen van de data \n\nError: " + ex.Message);
                logger.Error("Loading Database (startup)", ex);
                Application.Current.Shutdown(-1);
            }
        }
        public void Save()
        {
            if (!DatumViewModel.HasDates)
            {
                MessageBoxService messageService = new MessageBoxService();
                messageService.ShowMessageBox("Je hebt nog geen datum gekozen!");
                return;
            }

            try
            {
                //Add prestatie + dates to DB
                if (ButtonToevoegenContent == "Toevoegen")
                {
                    //Add date(s) to DB
                    Ctx.Datums.AddRange(DatumViewModel.NewDates);
                    //Add prestatie to DB (parameter needs to be last date)
                    CurrentView.Save(DatumViewModel.NewDates.Last().Date);

                    #region Legacy code

                    ////Add Dates to DB
                    //foreach (var d in DatumViewModel.NewDates)
                    //{
                    //    d.Id = CurrentView.AddPrestatie.Id;
                    //    context.Datum.Add(d);

                    //    //EF is retarded and thinks that I readded the Strijkers to the db, while I didn't.
                    //    //I Just use them as foreign relantionschip, I can't just use the id, because I need the name
                    //    //Manually said this is not true
                    //    //https://msdn.microsoft.com/en-us/magazine/dn166926.aspx
                    //    //This link explains it!

                    //    if (d.Strijker1 != null)
                    //        context.Entry(d.Strijker1).State = EntityState.Unchanged;
                    //    if (d.Strijker2 != null)
                    //        context.Entry(d.Strijker2).State = EntityState.Unchanged;
                    //    if (d.Strijker3 != null)
                    //        context.Entry(d.Strijker3).State = EntityState.Unchanged;
                    //    if (d.Strijker4 != null)
                    //        context.Entry(d.Strijker4).State = EntityState.Unchanged;
                    //    if (d.Strijker5 != null)
                    //        context.Entry(d.Strijker5).State = EntityState.Unchanged;
                    //}

                    #endregion
                }
                //Update (edit) last prestatie + dates
                else
                {
                    CurrentView.UpdateLast();

                    ButtonBerekenContent = "Berekenen";
                    ButtonToevoegenContent = "Toevoegen";
                    ButtonChangeContent = "Laatste prestatie aanpassen";
                }

                //Save changes to DB
                Ctx.Complete();
            }
            catch (Exception ex)
            {
                Ctx.DiscardChanges();
                MessageBoxService messageService = new MessageBoxService();
                messageService.ShowErrorBox("Er heeft zich een probleem voorgedaan bij het opslaan van een prestatie \n\nError: " + ex.Message);
            }

            //Re init CurrentView => Make new Prestatie, ...
            CurrentView.Init();
            DatumViewModel.Init();
        }
        public void Save()
        {
            if (ButtonToevoegenContent == "Annuleren")
            {
                Ctx.Strijkers.Add(SelectedPersoneel);
            }

            try
            {
                Ctx.Complete();
            }
            catch (Exception ex)
            {
                MessageBoxService messageService = new MessageBoxService();
                messageService.ShowErrorBox("Er heeft zich een probleem voorgedaan bij het opslaan van de strijksters \n\nError: " + ex.Message);
            }

            ButtonToevoegenContent = "Toevoegen";
        }
        private void SelectedTypePropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
        {
            var changed = sender as KlantType;

            try
            {
                Ctx.Complete();
            }
            catch (Exception ex)
            {
                MessageBoxService messageService = new MessageBoxService();
                messageService.ShowErrorBox("Er heeft zich een probleem voorgedaan bij het opslaan van een bestaande 'Klant Type' ("+ changed.Type + " " + changed.Naam + ")\n\nError: " + ex.Message);
            }
        }
        public void Delete()
        {
            try
            {
                Ctx.KlantTypes.Remove(SelectedType);
                Ctx.Complete();
            }
            catch (Exception ex)
            {
                Ctx.DiscardChanges();
                MessageBoxService messageService = new MessageBoxService();
                messageService.ShowErrorBox("Er heeft zich een probleem voorgedaan bij het verwijderen van een bestaande 'Klant Type' (" + SelectedType.Type + " " + SelectedType.Naam + ")\n\nError: " + ex.Message);
            }

            GetData();
        }
        public virtual void Add()
        {
            try
            {
                Ctx.KlantTypes.Add(AddType);
                Ctx.Complete();
            }
            catch (Exception ex)
            {
                Ctx.DiscardChanges();
                MessageBoxService messageService = new MessageBoxService();
                messageService.ShowErrorBox("Er heeft zich een probleem voorgedaan bij het toevoegen van een nieuwe 'Klant Type' (" + AddType.Type + " " + AddType.Naam + ")\n\nError: " + ex.Message);
            }

            GetData();
            AddType = new KlantType();
        }