EmployeeBrowseVM.cs 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  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. /// <summary>
  49. /// Видимо ли на данный момент поле поиска
  50. /// </summary>
  51. public bool SearchVisible { get; set; }
  52. /// <summary>
  53. /// По какой фамилии фильтровать поиск
  54. /// </summary>
  55. public string FilterSurname { get; set; }
  56. /// <summary>
  57. /// По какой должности фильтровать поиск
  58. /// </summary>
  59. public Entities.Title FilterTitle { get; set; }
  60. public EmployeeBrowseVM()
  61. {
  62. UndoCommand = new DelegateCommand(Undo_Executed, WhenDirty);
  63. SaveCommand = new DelegateCommand(Save_Executed, WhenDirty);
  64. NewCommand = new DelegateCommand(New_Executed, WhenClean);
  65. EditCommand = new DelegateCommand(Edit_Executed, WhenClean);
  66. DeleteCommand = new DelegateCommand(Delete_Executed, WhenClean);
  67. FindCommand = new DelegateCommand(Find_Executed, WhenClean);
  68. GridBlocked = true;
  69. _dbContext = new InvestContext();
  70. Employees = new ObservableCollection<Employee>(_dbContext.Employees.ToList());
  71. AllTitles = new ObservableCollection<Title>(_dbContext.Titles.ToList());
  72. }
  73. /// <summary>
  74. /// Выполняет отмену
  75. /// </summary>
  76. private void Undo_Executed()
  77. {
  78. // http://stackoverflow.com/questions/5466677/ddg#17967959
  79. var changedEntries = _dbContext.ChangeTracker.Entries()
  80. .Where(x => x.State != EntityState.Unchanged)
  81. .ToList();
  82. foreach (var entry in changedEntries)
  83. {
  84. switch (entry.State)
  85. {
  86. case EntityState.Modified:
  87. entry.CurrentValues.SetValues(entry.OriginalValues);
  88. entry.State = EntityState.Unchanged;
  89. break;
  90. case EntityState.Added:
  91. entry.State = EntityState.Detached;
  92. break;
  93. case EntityState.Deleted:
  94. entry.State = EntityState.Unchanged;
  95. break;
  96. }
  97. }
  98. Employees = new ObservableCollection<Employee>(_dbContext.Employees.ToList());
  99. _dbContext.SaveChanges();
  100. GridBlocked = true;
  101. isDirty = false;
  102. RaisePropertyChanged(nameof(GridBlocked));
  103. RaisePropertyChanged(nameof(Employees));
  104. ReEvaluateCommands();
  105. }
  106. /// <summary>
  107. /// Сохраняет все изменения
  108. /// </summary>
  109. private void Save_Executed()
  110. {
  111. try
  112. {
  113. _dbContext.SaveChanges();
  114. } catch (DbUpdateException ex)
  115. {
  116. string message = "Введённые данные о сотруднике не верны.";
  117. if (ex.InnerException != null)
  118. {
  119. message += "\r\n" + ex.InnerException.Message;
  120. }
  121. MessageBox.Show(message);
  122. return;
  123. }
  124. GridBlocked = true;
  125. isDirty = false;
  126. RaisePropertyChanged(nameof(GridBlocked));
  127. ReEvaluateCommands();
  128. }
  129. /// <summary>
  130. /// Добавляет нового пользователя
  131. /// </summary>
  132. private void New_Executed()
  133. {
  134. Employee newEmployee = new Employee();
  135. _dbContext.Attach(newEmployee);
  136. Employees.Add(newEmployee);
  137. GridBlocked = false;
  138. isDirty = true;
  139. RaisePropertyChanged(nameof(GridBlocked));
  140. ReEvaluateCommands();
  141. }
  142. /// <summary>
  143. /// Переводит DataGrid в режим редактирования
  144. /// </summary>
  145. private void Edit_Executed()
  146. {
  147. GridBlocked = false;
  148. isDirty = true;
  149. RaisePropertyChanged(nameof(GridBlocked));
  150. ReEvaluateCommands();
  151. }
  152. /// <summary>
  153. /// Удаляет сотрудника
  154. /// </summary>
  155. private void Delete_Executed()
  156. {
  157. if (SelectedEmployee == null)
  158. {
  159. MessageBox.Show("Не выбрана строка для удаления");
  160. return;
  161. }
  162. MessageBoxResult result = MessageBox.Show(
  163. $"Удалить сотрудника: {SelectedEmployee.Surname} {SelectedEmployee.Name} {SelectedEmployee.Patronymic}",
  164. "Предупреждение",
  165. MessageBoxButton.OKCancel);
  166. if (result != MessageBoxResult.OK)
  167. {
  168. return;
  169. }
  170. _dbContext.Employees.Remove(SelectedEmployee);
  171. Employees.Remove(SelectedEmployee);
  172. isDirty = true;
  173. RaisePropertyChanged(nameof(isDirty));
  174. RaisePropertyChanged(nameof(SelectedEmployee));
  175. ReEvaluateCommands();
  176. }
  177. /// <summary>
  178. /// Выполняет поиск
  179. /// </summary>
  180. private void Find_Executed()
  181. {
  182. SearchVisible = true;
  183. RaisePropertyChanged(nameof(SearchVisible));
  184. }
  185. /// <summary>
  186. /// CanExecute когда isDirty = false
  187. /// </summary>
  188. private bool WhenClean()
  189. {
  190. if (isDirty == false)
  191. {
  192. return true;
  193. } else
  194. {
  195. return false;
  196. }
  197. }
  198. /// <summary>
  199. /// CanExecute когда isDirty = true
  200. /// </summary>
  201. private bool WhenDirty()
  202. {
  203. if (isDirty == true)
  204. {
  205. return true;
  206. }
  207. else
  208. {
  209. return false;
  210. }
  211. }
  212. /// <summary>
  213. /// Заставляет все команды вызвать свои методы .RaiseExecuteChanged
  214. /// </summary>
  215. private void ReEvaluateCommands()
  216. {
  217. UndoCommand.RaiseCanExecuteChanged();
  218. SaveCommand.RaiseCanExecuteChanged();
  219. NewCommand.RaiseCanExecuteChanged();
  220. EditCommand.RaiseCanExecuteChanged();
  221. DeleteCommand.RaiseCanExecuteChanged();
  222. FindCommand.RaiseCanExecuteChanged();
  223. }
  224. }
  225. }