using InvestTracker.Entities;
using Microsoft.EntityFrameworkCore;
using Prism.Commands;
using Prism.Mvvm;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
namespace InvestTracker.VM
{
public class EmployeeBrowseVM : BindableBase
{
#region Команды
public DelegateCommand UndoCommand { get; set; }
public DelegateCommand SaveCommand { get; set; }
public DelegateCommand NewCommand { get; set; }
public DelegateCommand EditCommand { get; set; }
public DelegateCommand DeleteCommand { get; set; }
public DelegateCommand FindCommand { get; set; }
#endregion
///
/// Определяет можно ли редактировать значения в сетке данных
///
public bool GridBlocked { get; set; }
///
/// Контекст БД
///
private InvestContext _dbContext;
///
/// Определяет состояние приложения
///
private bool isDirty = false;
///
/// Список всех сотрудников
///
public ObservableCollection Employees { get; set; }
///
/// Список всех должностей для выбора в колонках
///
public ObservableCollection AllTitles { get; set; }
///
/// Выбранный на данный момент сотрудник
///
public Employee? SelectedEmployee { get; set; }
public EmployeeBrowseVM()
{
UndoCommand = new DelegateCommand(Undo_Executed, WhenDirty);
SaveCommand = new DelegateCommand(Save_Executed, WhenDirty);
NewCommand = new DelegateCommand(New_Executed, WhenClean);
EditCommand = new DelegateCommand(Edit_Executed, WhenClean);
DeleteCommand = new DelegateCommand(Delete_Executed, WhenClean);
FindCommand = new DelegateCommand(Find_Executed, WhenClean);
GridBlocked = true;
_dbContext = new InvestContext();
Employees = new ObservableCollection(_dbContext.Employees.ToList());
AllTitles = new ObservableCollection(_dbContext.Titles.ToList());
}
///
/// Выполняет отмену
///
private void Undo_Executed()
{
// http://stackoverflow.com/questions/5466677/ddg#17967959
var changedEntries = _dbContext.ChangeTracker.Entries()
.Where(x => x.State != EntityState.Unchanged)
.ToList();
foreach (var entry in changedEntries)
{
switch (entry.State)
{
case EntityState.Modified:
entry.CurrentValues.SetValues(entry.OriginalValues);
entry.State = EntityState.Unchanged;
break;
case EntityState.Added:
entry.State = EntityState.Detached;
break;
case EntityState.Deleted:
entry.State = EntityState.Unchanged;
break;
}
}
Employees = new ObservableCollection(_dbContext.Employees.ToList());
_dbContext.SaveChanges();
GridBlocked = true;
isDirty = false;
RaisePropertyChanged(nameof(GridBlocked));
RaisePropertyChanged(nameof(Employees));
ReEvaluateCommands();
}
///
/// Сохраняет все изменения
///
private void Save_Executed()
{
try
{
_dbContext.SaveChanges();
} catch (DbUpdateException ex)
{
string message = "Введённые данные о сотруднике не верны.";
if (ex.InnerException != null)
{
message += "\r\n" + ex.InnerException.Message;
}
MessageBox.Show(message);
return;
}
GridBlocked = true;
isDirty = false;
RaisePropertyChanged(nameof(GridBlocked));
ReEvaluateCommands();
}
///
/// Добавляет нового пользователя
///
private void New_Executed()
{
Employee newEmployee = new Employee();
_dbContext.Attach(newEmployee);
Employees.Add(newEmployee);
GridBlocked = false;
isDirty = true;
RaisePropertyChanged(nameof(GridBlocked));
ReEvaluateCommands();
}
///
/// Переводит DataGrid в режим редактирования
///
private void Edit_Executed()
{
GridBlocked = false;
isDirty = true;
RaisePropertyChanged(nameof(GridBlocked));
ReEvaluateCommands();
}
///
/// Удаляет сотрудника
///
private void Delete_Executed()
{
if (SelectedEmployee == null)
{
MessageBox.Show("Не выбрана строка для удаления");
return;
}
MessageBoxResult result = MessageBox.Show(
$"Удалить сотрудника: {SelectedEmployee.Surname} {SelectedEmployee.Name} {SelectedEmployee.Patronymic}",
"Предупреждение",
MessageBoxButton.OKCancel);
if (result != MessageBoxResult.OK)
{
return;
}
_dbContext.Employees.Remove(SelectedEmployee);
Employees.Remove(SelectedEmployee);
isDirty = true;
RaisePropertyChanged(nameof(isDirty));
RaisePropertyChanged(nameof(SelectedEmployee));
ReEvaluateCommands();
}
///
/// Выполняет поиск
///
private void Find_Executed()
{
MessageBox.Show("Searching...");
ReEvaluateCommands();
}
///
/// CanExecute когда isDirty = false
///
private bool WhenClean()
{
if (isDirty == false)
{
return true;
} else
{
return false;
}
}
///
/// CanExecute когда isDirty = true
///
private bool WhenDirty()
{
if (isDirty == true)
{
return true;
}
else
{
return false;
}
}
///
/// Заставляет все команды вызвать свои методы .RaiseExecuteChanged
///
private void ReEvaluateCommands()
{
UndoCommand.RaiseCanExecuteChanged();
SaveCommand.RaiseCanExecuteChanged();
NewCommand.RaiseCanExecuteChanged();
EditCommand.RaiseCanExecuteChanged();
DeleteCommand.RaiseCanExecuteChanged();
FindCommand.RaiseCanExecuteChanged();
}
}
}