EmployeeBrowseVM.cs 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  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. MessageBox.Show("Undoing");
  67. isDirty = true;
  68. ReEvaluateCommands();
  69. }
  70. /// <summary>
  71. /// Сохраняет все изменения
  72. /// </summary>
  73. private void Save_Executed()
  74. {
  75. try
  76. {
  77. _dbContext.SaveChanges();
  78. } catch (DbUpdateException ex)
  79. {
  80. string message = "Введённые данные о сотруднике не верны.";
  81. if (ex.InnerException != null)
  82. {
  83. message += "\r\n" + ex.InnerException.Message;
  84. }
  85. MessageBox.Show(message);
  86. }
  87. GridBlocked = true;
  88. isDirty = false;
  89. RaisePropertyChanged(nameof(GridBlocked));
  90. ReEvaluateCommands();
  91. }
  92. /// <summary>
  93. /// Добавляет нового пользователя
  94. /// </summary>
  95. private void New_Executed()
  96. {
  97. Employee newEmployee = new Employee();
  98. _dbContext.Attach(newEmployee);
  99. Employees.Add(newEmployee);
  100. GridBlocked = false;
  101. isDirty = true;
  102. RaisePropertyChanged(nameof(GridBlocked));
  103. ReEvaluateCommands();
  104. }
  105. /// <summary>
  106. /// Переводит DataGrid в режим редактирования
  107. /// </summary>
  108. private void Edit_Executed()
  109. {
  110. GridBlocked = false;
  111. isDirty = true;
  112. RaisePropertyChanged(nameof(GridBlocked));
  113. ReEvaluateCommands();
  114. }
  115. /// <summary>
  116. /// Удаляет сотрудника
  117. /// </summary>
  118. private void Delete_Executed()
  119. {
  120. if (SelectedEmployee != null)
  121. {
  122. MessageBoxResult result = MessageBox.Show(
  123. $"Удалить сотрудника: {SelectedEmployee.Surname} {SelectedEmployee.Name} {SelectedEmployee.Patronymic}",
  124. "Предупреждение",
  125. MessageBoxButton.OKCancel);
  126. if (result == MessageBoxResult.OK)
  127. {
  128. _dbContext.Employees.Remove(SelectedEmployee);
  129. _dbContext.SaveChanges();
  130. Employees.Remove(SelectedEmployee);
  131. } else
  132. {
  133. MessageBox.Show("Не выбрана строка для удаления");
  134. }
  135. }
  136. isDirty = true;
  137. RaisePropertyChanged(nameof(isDirty));
  138. RaisePropertyChanged(nameof(SelectedEmployee));
  139. ReEvaluateCommands();
  140. }
  141. /// <summary>
  142. /// Выполняет поиск
  143. /// </summary>
  144. private void Find_Executed()
  145. {
  146. MessageBox.Show("Searching...");
  147. ReEvaluateCommands();
  148. }
  149. /// <summary>
  150. /// CanExecute когда isDirty = false
  151. /// </summary>
  152. private bool WhenClean()
  153. {
  154. if (isDirty == false)
  155. {
  156. return true;
  157. } else
  158. {
  159. return false;
  160. }
  161. }
  162. /// <summary>
  163. /// CanExecute когда isDirty = true
  164. /// </summary>
  165. private bool WhenDirty()
  166. {
  167. if (isDirty == true)
  168. {
  169. return true;
  170. }
  171. else
  172. {
  173. return false;
  174. }
  175. }
  176. /// <summary>
  177. /// Заставляет все команды вызвать свои методы .RaiseExecuteChanged
  178. /// </summary>
  179. private void ReEvaluateCommands()
  180. {
  181. UndoCommand.RaiseCanExecuteChanged();
  182. SaveCommand.RaiseCanExecuteChanged();
  183. NewCommand.RaiseCanExecuteChanged();
  184. EditCommand.RaiseCanExecuteChanged();
  185. DeleteCommand.RaiseCanExecuteChanged();
  186. FindCommand.RaiseCanExecuteChanged();
  187. }
  188. }
  189. }