public Task EditCommand(object selectedItem, ref bool IsErrorTask)
        {
            // получаем выделенный объект
            Task selectedtask = selectedItem as Task;

            Task task = selectedtask;

            Task oldtask = new Task()
            {
                Id_Task                   = selectedtask.Id_Task,
                Name_Task                 = selectedtask.Name_Task,
                Description_Task          = selectedtask.Description_Task,
                Performers_Task           = selectedtask.Performers_Task,
                Date_of_registration_Task = selectedtask.Date_of_registration_Task,
                Status_Task               = selectedtask.Status_Task,
                Planned_time_Task         = selectedtask.Planned_time_Task,
                Actual_time_Task          = selectedtask.Actual_time_Task,
                Date_of_completion_Task   = selectedtask.Date_of_completion_Task,
                SubTasks                  = selectedtask.SubTasks
            };


            TaskWindow taskWindow = new TaskWindow(oldtask);

            if (taskWindow.ShowDialog() == true)
            {
                // получаем измененный объект
                task = db.Tasks.Find(taskWindow.Task.Id_Task);



                //запоминаем первоначальные данные
                int old_Actual_time_Task = task.Actual_time_Task;
                //запоминаем первоначальные данные
                int old_Planned_time_Task = task.Planned_time_Task;

                //запоминаем статус задачи
                string old_status_task = task.Status_Task;


                if (old_status_task != taskWindow.Task.Status_Task)
                {
                    if (old_status_task == "Назначена" && taskWindow.Task.Status_Task == "Завершена")
                    {
                        MessageBox.Show(Resource1.Status_Assigned_СompletedError, Resource1.HeadingError);

                        IsErrorTask = true;
                        return(task);
                    }



                    else if (taskWindow.Task.Status_Task == "Завершена")
                    {
                        if (CanChangeStatus(selectedtask))
                        {
                            ChangeStatus(selectedtask);
                        }
                        else
                        {
                            MessageBox.Show(Resource1.SubTasksStatusError, Resource1.HeadingError);

                            IsErrorTask = true;
                            return(task);
                        }
                    }
                }


                task.Name_Task                 = taskWindow.Task.Name_Task;
                task.Description_Task          = taskWindow.Task.Description_Task;
                task.Performers_Task           = taskWindow.Task.Performers_Task;
                task.Date_of_registration_Task = taskWindow.Task.Date_of_registration_Task;
                task.Status_Task               = taskWindow.Task.Status_Task;
                task.Planned_time_Task         = taskWindow.Task.Planned_time_Task;
                task.Actual_time_Task          = taskWindow.Task.Actual_time_Task;
                task.Date_of_completion_Task   = taskWindow.Task.Date_of_completion_Task;

                task.All_Actual_time_Task  += task.Actual_time_Task - old_Actual_time_Task;
                task.All_Planned_time_Task += task.Planned_time_Task - old_Planned_time_Task;


                //флаг нужен для работы цикла
                bool flag = true;
                //получаем нашу подзадачу для инициализации полей его родителя
                int  change_Actual_time_Task  = task.Actual_time_Task - old_Actual_time_Task;
                int  change_Planned_time_Task = task.Planned_time_Task - old_Planned_time_Task;
                Task children_task            = task;
                // создаем переменную родитель, для того, чтобы изменить у родителя поля Actual_time_Task и All_Planned_time_Task
                Task parent_task = new Task();
                //бесконечно обращаемся в цикле, чтобы изменить у каждого родители поля Actual_time_Task и All_Planned_time_Task, так как возможно вложенность подзадач
                while (flag == true)
                {
                    if (children_task.Ref_Task != 0)
                    {
                        // получаем объект родитель
                        parent_task = db.Tasks.Where(c => c.Id_Task == children_task.Ref_Task).FirstOrDefault();
                        // изменяем у него вычисляемые поля
                        parent_task.All_Actual_time_Task  += change_Actual_time_Task;
                        parent_task.All_Planned_time_Task += change_Planned_time_Task;
                        // необоходимо для того, чтобы узнать есть ли вложенность подзадач, чтобы дальше по дереву изменить у всех вычисляемые поля
                        children_task = parent_task;
                    }
                    // как только родитель и ребенок это один тот же объект, прекращаем цикл.
                    else if (children_task.Id_Task == parent_task.Id_Task)
                    {
                        flag = false;
                    }
                    else if (children_task.Ref_Task == 0)
                    {
                        flag = false;
                    }
                }

                db.Entry(task).State = EntityState.Modified;
                db.SaveChanges();
                IsErrorTask = false;
                return(task);
            }

            IsErrorTask = true;
            return(task);
        }
        public Task AddSubCommand(object selectedItem, ref bool IsErrorTask)
        {
            // получаем выделенный объект
            Task task = selectedItem as Task;

            if (selectedItem == null)
            {
                MessageBox.Show(Resource1.SelectItemNull, Resource1.HeadingError);
                IsErrorTask = true;
                return(task);
            }

            TaskWindow window = new TaskWindow(new Task());

            window.Task.Status_Task = "Назначена";
            if (window.ShowDialog() == true)
            {
                Task subtask = window.Task;

                if (subtask.Status_Task == "Завершена")
                {
                    MessageBox.Show(Resource1.Status_Assigned_СompletedError, Resource1.HeadingError);
                    IsErrorTask = true;
                    return(task);
                }

                if (subtask.Date_of_registration_Task == null)
                {
                    MessageBox.Show(Resource1.ButtonClickError, Resource1.HeadingError);
                    IsErrorTask = true;
                    return(task);
                }

                subtask.All_Actual_time_Task  = subtask.Actual_time_Task;
                subtask.All_Planned_time_Task = subtask.Planned_time_Task;

                subtask.Ref_Task = task.Id_Task;

                task.SubTasks.Add(subtask);

                //флаг нужен для работы цикла
                bool flag = true;
                //получаем нашу подзадачу для инициализации полей его родителя
                Task children_task = subtask;
                // создаем переменную родитель, для того, чтобы изменить у родителя поля Actual_time_Task и All_Planned_time_Task
                Task parent_task = new Task();
                //бесконечно обращаемся в цикле, чтобы изменить у каждого родители поля Actual_time_Task и All_Planned_time_Task, так как возможно вложенность подзадач
                while (flag == true)
                {
                    if (children_task.Ref_Task != 0)
                    {
                        // получаем объект родитель
                        parent_task = db.Tasks.Where(c => c.Id_Task == children_task.Ref_Task).FirstOrDefault();
                        // изменяем у него вычисляемые поля
                        parent_task.All_Actual_time_Task  += subtask.Actual_time_Task;
                        parent_task.All_Planned_time_Task += subtask.Planned_time_Task;
                        // необоходимо для того, чтобы узнать есть ли вложенность подзадач, чтобы дальше по дереву изменить у всех вычисляемые поля
                        children_task = parent_task;
                    }
                    // как только родитель и ребенок это один тот же объект, прекращаем цикл.
                    else if (children_task.Id_Task == parent_task.Id_Task)
                    {
                        flag = false;
                    }
                }

                db.Tasks.Add(subtask);
                db.SaveChanges();
                IsErrorTask = false;
                return(subtask);
            }

            IsErrorTask = true;
            return(task);
        }