// Verified
        public void ExecuteAddEdit(object sender, RoutedEventArgs e)
        {
            // Проверки TextBox на null и пустую строку
            if (model.Text == null || model.Text == "")
            {
                MessageBox.Show("Укажите модель!", "Ошибка!", MessageBoxButton.OK, MessageBoxImage.Error);
                return;
            }
            else
            {
                foreach (var item in SourceList)
                {
                    if (item._model == model.Text)
                    {
                        // Если сейчас добавление, то просто вывести ошибку
                        if (isAdd)
                        {
                            MessageBox.Show("Указанная модель уже существует!", "Ошибка!", MessageBoxButton.OK, MessageBoxImage.Error);
                            return;
                        }
                        // Если сейчас изменение, то в случае совпадения индексов ошибку не выводить
                        else
                        {
                            // Вывести ошибку, если элементы таблицы имеют разные индексы,
                            // т.е. такой логин уже есть у кого то другого в таблице
                            if (item._carriage_id != SourceList[index]._carriage_id)
                            {
                                MessageBox.Show("Указанная модель уже существует!", "Ошибка!", MessageBoxButton.OK, MessageBoxImage.Error);
                                return;
                            }
                        }
                    }
                }
            }

            if (type.Text == null || type.Text == "")
            {
                MessageBox.Show("Укажите тип!", "Ошибка!", MessageBoxButton.OK, MessageBoxImage.Error);
                return;
            }

            float resultFloat;
            int   resultInt;

            // Проверки TextBox на null и пустую строку
            if (weight.Text == null || weight.Text == "")
            {
                MessageBox.Show("Укажите вес!", "Ошибка!", MessageBoxButton.OK, MessageBoxImage.Error);
                return;
            }
            else if (!float.TryParse(weight.Text, out resultFloat))
            {
                MessageBox.Show("Некорректная вес!", "Ошибка!", MessageBoxButton.OK, MessageBoxImage.Error);
                return;
            }

            if (maxLoadWeight.Text == null || maxLoadWeight.Text == "")
            {
                MessageBox.Show("Укажите максимально разрешённую массу!", "Ошибка!", MessageBoxButton.OK, MessageBoxImage.Error);
                return;
            }
            else if (!float.TryParse(weight.Text, out resultFloat))
            {
                MessageBox.Show("Некорректная максимально разрешённая масса!", "Ошибка!", MessageBoxButton.OK, MessageBoxImage.Error);
                return;
            }

            if (type.SelectedIndex == 0)
            {
                if (maxSeats.Text == null || maxSeats.Text == "")
                {
                    MessageBox.Show("Укажите количество мест!", "Ошибка!", MessageBoxButton.OK, MessageBoxImage.Error);
                    return;
                }
                else if (!int.TryParse(maxSeats.Text, out resultInt))
                {
                    MessageBox.Show("Некорректное количество мест!", "Ошибка!", MessageBoxButton.OK, MessageBoxImage.Error);
                    return;
                }
            }

            CarriagesM temp = new CarriagesM();

            temp._model           = model.Text;
            temp._type            = type.SelectedIndex;
            temp._weight          = float.Parse(weight.Text);
            temp._max_load_weight = float.Parse(maxLoadWeight.Text);

            if (type.SelectedIndex == 0)
            {
                temp._max_seats = int.Parse(maxSeats.Text);
                temp._class     = carriageClass.SelectedIndex;
            }
            else
            {
                temp._max_seats = -1;
                temp._class     = -1;
            }

            // Сохранение нового юзера в БД
            if (isAdd)
            {
                // Добавляем объект в БД
                dbContext.CarriagesMs.Local.Add(temp);

                // Очищаем поля
                model.Text                  = null;
                type.SelectedIndex          = 0;
                weight.Text                 = null;
                maxLoadWeight.Text          = null;
                maxSeats.Text               = null;
                carriageClass.SelectedIndex = 0;
            }
            else
            {
                // Получаем объект из БД по айди, который будем изменять
                int id   = SourceList[index]._carriage_id;
                var loco = dbContext.CarriagesMs.Local
                           .Single(o => o._carriage_id == id);

                // Изменяем, просто изменяя поля на поля объекта temp
                loco._model           = temp._model;
                loco._type            = temp._type;
                loco._weight          = temp._weight;
                loco._max_load_weight = temp._max_load_weight;
                loco._max_seats       = temp._max_seats;
                loco._class           = temp._class;

                // Говорим контексту БД, что данный объект был изменен
                dbContext.Entry(loco).State = EntityState.Modified;
            }
            dbContext.SaveChanges();

            // Обновление списка
            SourceList = dbContext.CarriagesMs.Local.ToBindingList();

            TableV.Current_DataGrid.ItemsSource = SourceList;
            TableV.Current_DataGrid.Items.Refresh();
        }
        // Verified
        public void Delete()
        {
            if (TableV.Current_DataGrid.SelectedItems.Count < 1)
            {
                MessageBox.Show("Выберите элементы для удаления!", "Ошибка!", MessageBoxButton.OK, MessageBoxImage.Error);
                return;
            }

            while (TableV.Current_DataGrid.SelectedItems.Count > 0)
            {
                index = TableV.Current_DataGrid.SelectedIndex;

                CarriagesM deleteEntity = SourceList[index];

                var trains = (from o in dbContext.TrainsMs
                              where (o._first_carriage_id == deleteEntity._carriage_id ||
                                     o._second_carriage_id == deleteEntity._carriage_id ||
                                     o._third_carriage_id == deleteEntity._carriage_id ||
                                     o._fourth_carriage_id == deleteEntity._carriage_id ||
                                     o._fifth_carriage_id == deleteEntity._carriage_id)
                              select o);

                if (trains != null)
                {
                    foreach (var train in trains)
                    {
                        //1
                        if (train._first_carriage_id == deleteEntity._carriage_id)
                        {
                            train._first_carriage_id = -1;
                        }
                        //2
                        if (train._second_carriage_id == deleteEntity._carriage_id)
                        {
                            train._second_carriage_id = -1;
                        }
                        //3
                        if (train._third_carriage_id == deleteEntity._carriage_id)
                        {
                            train._third_carriage_id = -1;
                        }
                        //4
                        if (train._fourth_carriage_id == deleteEntity._carriage_id)
                        {
                            train._fourth_carriage_id = -1;
                        }
                        //5
                        if (train._fifth_carriage_id == deleteEntity._carriage_id)
                        {
                            train._fifth_carriage_id = -1;
                        }
                    }
                }

                dbContext.CarriagesMs.Local.Remove(deleteEntity);

                // Удаляем НЕконтекстного юзера из SourceList
                SourceList.Remove(deleteEntity);
            }

            // Сохраняем контекст БД
            dbContext.SaveChanges();

            TableV.Current_DataGrid.ItemsSource = SourceList;
            TableV.Current_DataGrid.Items.Refresh();
        }
        // Verified
        public void AddEdit(bool isAdd)
        {
            this.isAdd = isAdd;
            // Показываем диалоговое окно
            DialogV dialogV    = new DialogV();
            Grid    dialogGrid = dialogV.Dialog_Grid;

            Button button = dialogV.Button_Execute;

            // Если это добавление
            if (isAdd)
            {
                button.Content = App.Current.Resources["Text_Add"];
                index          = -1;
            }
            // Если это изменение
            else
            {
                // если ничего не выбрано в датагриде то ошибка
                // если выбрано больше 1 элемента то тоже ошибка
                if (TableV.Current_DataGrid.SelectedItems.Count < 1)
                {
                    MessageBox.Show("Выберите элемент для изменения!", "Ошибка!", MessageBoxButton.OK, MessageBoxImage.Error);
                    return;
                }
                else if (TableV.Current_DataGrid.SelectedItems.Count > 1)
                {
                    MessageBox.Show("Можно выбрать для изменения не более ОДНОГО элемента за раз!", "Ошибка!", MessageBoxButton.OK, MessageBoxImage.Error);
                    return;
                }

                // индекс текущей выбранной строки в DataGrid
                // кастыль, но куда без кастылей?
                index = TableV.Current_DataGrid.SelectedIndex;

                // Если всё ок, вставляем данные для данного юзера в форму, который затем будем менять
                CarriagesM temp = SourceList[index];

                model.Text         = temp._model;
                type.SelectedIndex = temp._type;
                weight.Text        = temp._weight.ToString();
                maxLoadWeight.Text = temp._max_load_weight.ToString();

                if (temp._max_seats != -1)
                {
                    maxSeats.Text = temp._max_seats.ToString();
                }
                if (temp._class != -1)
                {
                    carriageClass.SelectedIndex = temp._class;
                }

                button.Content = App.Current.Resources["Text_Edit"];
            }

            button.Click += new RoutedEventHandler(ExecuteAddEdit);

            // Вешаем элементы в Grid
            dialogGrid.Children.Add(Model);
            dialogGrid.Children.Add(Type);
            dialogGrid.Children.Add(Weight);
            dialogGrid.Children.Add(MaxLoadWeight);
            dialogGrid.Children.Add(MaxSeats);
            dialogGrid.Children.Add(CarriageClass);

            dialogGrid.Children.Add(model);
            dialogGrid.Children.Add(type);
            dialogGrid.Children.Add(weight);
            dialogGrid.Children.Add(maxLoadWeight);
            dialogGrid.Children.Add(maxSeats);
            dialogGrid.Children.Add(carriageClass);

            // Заполняем нижний Button текстом и вешаем локальный обработчик события нажатия

            dialogV.ShowDialog();

            // Очищаем Grid
            dialogGrid.Children.Remove(model);
            dialogGrid.Children.Remove(type);
            dialogGrid.Children.Remove(weight);
            dialogGrid.Children.Remove(maxLoadWeight);
            dialogGrid.Children.Remove(maxSeats);
            dialogGrid.Children.Remove(carriageClass);

            dialogGrid.Children.Remove(Model);
            dialogGrid.Children.Remove(Type);
            dialogGrid.Children.Remove(Weight);
            dialogGrid.Children.Remove(MaxLoadWeight);
            dialogGrid.Children.Remove(CarriageClass);
            dialogGrid.Children.Remove(MaxSeats);

            model.Text                  = null;
            type.SelectedIndex          = 0;
            weight.Text                 = null;
            maxLoadWeight.Text          = null;
            maxSeats.Text               = null;
            carriageClass.SelectedIndex = 0;

            maxSeats.IsEnabled      = true;
            carriageClass.IsEnabled = true;
        }