123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311 |
- using InvestTracker.Entities;
- using Microsoft.EntityFrameworkCore;
- using Microsoft.IdentityModel.Tokens;
- 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; }
- public DelegateCommand ToggleFilterCommand { get; set; }
- #endregion
- /// <summary>
- /// Определяет можно ли редактировать значения в сетке данных
- /// </summary>
- public bool GridBlocked { get; set; }
- /// <summary>
- /// Контекст БД
- /// </summary>
- private InvestContext _dbContext;
- /// <summary>
- /// Определяет состояние приложения
- /// </summary>
- private bool isDirty = false;
- /// <summary>
- /// Список всех сотрудников
- /// </summary>
- public ObservableCollection<Employee> Employees { get; set; }
- /// <summary>
- /// Список всех должностей для выбора в колонках
- /// </summary>
- public ObservableCollection<Title> AllTitles { get; set; }
- /// <summary>
- /// Выбранный на данный момент сотрудник
- /// </summary>
- public Employee? SelectedEmployee { get; set; }
- /// <summary>
- /// По какой фамилии фильтровать поиск
- /// </summary>
- public string? FilterSurname { get; set; }
- /// <summary>
- /// По какой должности фильтровать поиск
- /// </summary>
- public Entities.Title? FilterTitle { get; set; }
- /// <summary>
- /// Активен ли фильтр в данный момент
- /// </summary>
- public bool FilterActive { 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);
- ToggleFilterCommand = new DelegateCommand(ToggleFilterCommand_Executed, WhenClean);
- GridBlocked = true;
- _dbContext = new InvestContext();
- Employees = new ObservableCollection<Employee>(_dbContext.Employees.ToList());
- AllTitles = new ObservableCollection<Title>(_dbContext.Titles.ToList());
- FilterActive = false;
- }
- /// <summary>
- /// Выполняет отмену
- /// </summary>
- 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<Employee>(_dbContext.Employees.ToList());
- _dbContext.SaveChanges();
- GridBlocked = true;
- isDirty = false;
- RaisePropertyChanged(nameof(GridBlocked));
- RaisePropertyChanged(nameof(Employees));
- ReEvaluateCommands();
- }
- /// <summary>
- /// Сохраняет все изменения
- /// </summary>
- 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();
- }
-
- /// <summary>
- /// Добавляет нового пользователя
- /// </summary>
- private void New_Executed()
- {
- Employee newEmployee = new Employee();
- _dbContext.Attach(newEmployee);
- Employees.Add(newEmployee);
- GridBlocked = false;
- isDirty = true;
- RaisePropertyChanged(nameof(GridBlocked));
- ReEvaluateCommands();
- }
-
- /// <summary>
- /// Переводит DataGrid в режим редактирования
- /// </summary>
- private void Edit_Executed()
- {
- GridBlocked = false;
- isDirty = true;
- RaisePropertyChanged(nameof(GridBlocked));
- ReEvaluateCommands();
- }
-
- /// <summary>
- /// Удаляет сотрудника
- /// </summary>
- 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();
- }
-
- /// <summary>
- /// Выполняет поиск
- /// </summary>
- private void Find_Executed()
- {
- // 1. Установить список сотрудников по условиям
- Func<Employee, bool> filter = (Employee e) => {
- if (FilterSurname.IsNullOrEmpty() == false)
- {
- if (e.Surname != FilterSurname)
- {
- // Не совпадают фамилии
- return false;
- }
- }
- if (FilterTitle != null)
- {
- if (e.Title != FilterTitle)
- {
- // Не совпадают должности
- return false;
- }
- }
- return true;
- };
-
- var filteredEmployees = _dbContext.Employees
- .Where(filter)
- .ToList();
- // 2. Проверить результаты
- if (filteredEmployees.Count == 0)
- {
- MessageBox.Show("Не найдено ни одного сотрудника, используя заданные параметры");
- return;
- }
- // 3. Перезаписать сотрудников
- Employees = new ObservableCollection<Employee>(filteredEmployees);
- RaisePropertyChanged(nameof(Employees));
- }
-
- /// <summary>
- /// CanExecute когда isDirty = false
- /// </summary>
- private bool WhenClean()
- {
- if (isDirty == false)
- {
- return true;
- } else
- {
- return false;
- }
- }
- /// <summary>
- /// CanExecute когда isDirty = true
- /// </summary>
- private bool WhenDirty()
- {
- if (isDirty == true)
- {
- return true;
- }
- else
- {
- return false;
- }
- }
- private void ToggleFilterCommand_Executed()
- {
- FilterActive = !FilterActive;
- if (FilterActive == false)
- {
- // Сбрасываем фильтр
- Employees = new ObservableCollection<Employee>(_dbContext.Employees.ToList());
- RaisePropertyChanged(nameof(Employees));
- }
- RaisePropertyChanged(nameof(FilterActive));
- }
- /// <summary>
- /// Заставляет все команды вызвать свои методы .RaiseExecuteChanged
- /// </summary>
- private void ReEvaluateCommands()
- {
- UndoCommand.RaiseCanExecuteChanged();
- SaveCommand.RaiseCanExecuteChanged();
- NewCommand.RaiseCanExecuteChanged();
- EditCommand.RaiseCanExecuteChanged();
- DeleteCommand.RaiseCanExecuteChanged();
- FindCommand.RaiseCanExecuteChanged();
- ToggleFilterCommand.RaiseCanExecuteChanged();
- }
- }
- }
|