EmployeeBrowseVM.cs 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. using InvestTracker.Entities;
  2. using Microsoft.EntityFrameworkCore;
  3. using Prism.Commands;
  4. using Prism.Mvvm;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Collections.ObjectModel;
  8. using System.Linq;
  9. using System.Text;
  10. using System.Threading.Tasks;
  11. using System.Windows;
  12. namespace InvestTracker.VM
  13. {
  14. public class EmployeeBrowseVM : BindableBase
  15. {
  16. #region Команды
  17. public DelegateCommand UndoCommand { get; set; }
  18. public DelegateCommand SaveCommand { get; set; }
  19. public DelegateCommand NewCommand { get; set; }
  20. public DelegateCommand EditCommand { get; set; }
  21. public DelegateCommand DeleteCommand { get; set; }
  22. public DelegateCommand FindCommand { get; set; }
  23. #endregion
  24. /// <summary>
  25. /// Определяет можно ли редактировать значения в сетке данных
  26. /// </summary>
  27. public bool GridBlocked { get; set; }
  28. /// <summary>
  29. /// Контекст БД
  30. /// </summary>
  31. private InvestContext _dbContext;
  32. /// <summary>
  33. /// Определяет состояние приложения
  34. /// </summary>
  35. private bool isDirty = false;
  36. /// <summary>
  37. /// Список всех сотрудников
  38. /// </summary>
  39. public ObservableCollection<Employee> Employees { get; set; }
  40. /// <summary>
  41. /// Список всех должностей для выбора в колонках
  42. /// </summary>
  43. public ObservableCollection<Title> AllTitles { get; set; }
  44. /// <summary>
  45. /// Выбранный на данный момент сотрудник
  46. /// </summary>
  47. public Employee? SelectedEmployee { get; set; }
  48. public EmployeeBrowseVM()
  49. {
  50. UndoCommand = new DelegateCommand(Undo_Executed, WhenDirty);
  51. SaveCommand = new DelegateCommand(Save_Executed, WhenDirty);
  52. NewCommand = new DelegateCommand(New_Executed, WhenClean);
  53. EditCommand = new DelegateCommand(Edit_Executed, WhenClean);
  54. DeleteCommand = new DelegateCommand(Delete_Executed, WhenClean);
  55. FindCommand = new DelegateCommand(Find_Executed, WhenClean);
  56. GridBlocked = true;
  57. _dbContext = new InvestContext();
  58. Employees = new ObservableCollection<Employee>(_dbContext.Employees.ToList());
  59. AllTitles = new ObservableCollection<Title>(_dbContext.Titles.ToList());
  60. }
  61. /// <summary>
  62. /// Выполняет отмену
  63. /// </summary>
  64. private void Undo_Executed()
  65. {
  66. // http://stackoverflow.com/questions/5466677/ddg#17967959
  67. var changedEntries = _dbContext.ChangeTracker.Entries()
  68. .Where(x => x.State != EntityState.Unchanged)
  69. .ToList();
  70. foreach (var entry in changedEntries)
  71. {
  72. switch (entry.State)
  73. {
  74. case EntityState.Modified:
  75. entry.CurrentValues.SetValues(entry.OriginalValues);
  76. entry.State = EntityState.Unchanged;
  77. break;
  78. case EntityState.Added:
  79. entry.State = EntityState.Detached;
  80. break;
  81. case EntityState.Deleted:
  82. entry.State = EntityState.Unchanged;
  83. break;
  84. }
  85. }
  86. Employees = new ObservableCollection<Employee>(_dbContext.Employees.ToList());
  87. _dbContext.SaveChanges();
  88. GridBlocked = true;
  89. isDirty = false;
  90. RaisePropertyChanged(nameof(GridBlocked));
  91. RaisePropertyChanged(nameof(Employees));
  92. ReEvaluateCommands();
  93. }
  94. /// <summary>
  95. /// Сохраняет все изменения
  96. /// </summary>
  97. private void Save_Executed()
  98. {
  99. try
  100. {
  101. _dbContext.SaveChanges();
  102. } catch (DbUpdateException ex)
  103. {
  104. string message = "Введённые данные о сотруднике не верны.";
  105. if (ex.InnerException != null)
  106. {
  107. message += "\r\n" + ex.InnerException.Message;
  108. }
  109. MessageBox.Show(message);
  110. return;
  111. }
  112. GridBlocked = true;
  113. isDirty = false;
  114. RaisePropertyChanged(nameof(GridBlocked));
  115. ReEvaluateCommands();
  116. }
  117. /// <summary>
  118. /// Добавляет нового пользователя
  119. /// </summary>
  120. private void New_Executed()
  121. {
  122. Employee newEmployee = new Employee();
  123. _dbContext.Attach(newEmployee);
  124. Employees.Add(newEmployee);
  125. GridBlocked = false;
  126. isDirty = true;
  127. RaisePropertyChanged(nameof(GridBlocked));
  128. ReEvaluateCommands();
  129. }
  130. /// <summary>
  131. /// Переводит DataGrid в режим редактирования
  132. /// </summary>
  133. private void Edit_Executed()
  134. {
  135. GridBlocked = false;
  136. isDirty = true;
  137. RaisePropertyChanged(nameof(GridBlocked));
  138. ReEvaluateCommands();
  139. }
  140. /// <summary>
  141. /// Удаляет сотрудника
  142. /// </summary>
  143. private void Delete_Executed()
  144. {
  145. if (SelectedEmployee == null)
  146. {
  147. MessageBox.Show("Не выбрана строка для удаления");
  148. return;
  149. }
  150. MessageBoxResult result = MessageBox.Show(
  151. $"Удалить сотрудника: {SelectedEmployee.Surname} {SelectedEmployee.Name} {SelectedEmployee.Patronymic}",
  152. "Предупреждение",
  153. MessageBoxButton.OKCancel);
  154. if (result != MessageBoxResult.OK)
  155. {
  156. return;
  157. }
  158. _dbContext.Employees.Remove(SelectedEmployee);
  159. Employees.Remove(SelectedEmployee);
  160. isDirty = true;
  161. RaisePropertyChanged(nameof(isDirty));
  162. RaisePropertyChanged(nameof(SelectedEmployee));
  163. ReEvaluateCommands();
  164. }
  165. /// <summary>
  166. /// Выполняет поиск
  167. /// </summary>
  168. private void Find_Executed()
  169. {
  170. MessageBox.Show("Searching...");
  171. ReEvaluateCommands();
  172. }
  173. /// <summary>
  174. /// CanExecute когда isDirty = false
  175. /// </summary>
  176. private bool WhenClean()
  177. {
  178. if (isDirty == false)
  179. {
  180. return true;
  181. } else
  182. {
  183. return false;
  184. }
  185. }
  186. /// <summary>
  187. /// CanExecute когда isDirty = true
  188. /// </summary>
  189. private bool WhenDirty()
  190. {
  191. if (isDirty == true)
  192. {
  193. return true;
  194. }
  195. else
  196. {
  197. return false;
  198. }
  199. }
  200. /// <summary>
  201. /// Заставляет все команды вызвать свои методы .RaiseExecuteChanged
  202. /// </summary>
  203. private void ReEvaluateCommands()
  204. {
  205. UndoCommand.RaiseCanExecuteChanged();
  206. SaveCommand.RaiseCanExecuteChanged();
  207. NewCommand.RaiseCanExecuteChanged();
  208. EditCommand.RaiseCanExecuteChanged();
  209. DeleteCommand.RaiseCanExecuteChanged();
  210. FindCommand.RaiseCanExecuteChanged();
  211. }
  212. }
  213. }