/
naz_number
/
InventoryApp
Обзор
Документация
Войти
/
naz_number
/
InventoryApp
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
ViewModels/InventoryViewModel.cs
191 строка
6 KB
Nazar Melnik
.
18 дек 2025, 18:59
18 дек 2025, 18:59
c5c708f
Код
Авторство
О чём код?
using System; using System.Collections.ObjectModel; using System.ComponentModel; using System.Linq; using System.Runtime.CompilerServices; using System.Windows.Input; using InventoryApp.Models; using Microsoft.EntityFrameworkCore; namespace InventoryApp.ViewModels; public class InventoryViewModel : INotifyPropertyChanged { private readonly ObservableCollection<EquipmentUsage> _allUsages = new(); private ObservableCollection<EquipmentUsage> _equipmentUsages = new(); private bool _isAsc = true; private string? _searchText; private DateTime? _filterStartDate; private DateTime? _filterEndDate; public ObservableCollection<EquipmentUsage> EquipmentUsages { get => _equipmentUsages; set { if (!Equals(_equipmentUsages, value)) { _equipmentUsages = value; OnPropertyChanged(); OnPropertyChanged(nameof(TotalRecords)); } } } /// <summary> /// Общее количество записей в списке. /// </summary> public int TotalRecords => EquipmentUsages?.Count ?? 0; /// <summary> /// Текст на кнопке сортировки. /// </summary> public string SortButtonText => _isAsc ? "Сначала А-Я" : "Сначала Я-А"; /// <summary> /// Общая строка поиска (по оборудованию, сотруднику, месту). /// </summary> public string? SearchText { get => _searchText; set { if (_searchText != value) { _searchText = value; OnPropertyChanged(); ApplyFilters(); } } } /// <summary> /// Фильтр: дата начала периода. /// </summary> public DateTime? FilterStartDate { get => _filterStartDate; set { if (_filterStartDate != value) { _filterStartDate = value; OnPropertyChanged(); ApplyFilters(); } } } /// <summary> /// Фильтр: дата окончания периода. /// </summary> public DateTime? FilterEndDate { get => _filterEndDate; set { if (_filterEndDate != value) { _filterEndDate = value; OnPropertyChanged(); ApplyFilters(); } } } /// <summary> /// Команда сортировки записей (аналог OrderByCommand из примера). /// </summary> public ICommand OrderByCommand { get; } public InventoryViewModel() { using var db = new InventoryTechparkContext(); var usages = db.EquipmentUsages .Include(u => u.Equipment) .ThenInclude(e => e.Location) .Include(u => u.Employee) .Include(u => u.Status) .OrderByDescending(u => u.StartTime) .ToList(); foreach (var u in usages) { _allUsages.Add(u); } ApplyFilters(); // Привязка свойства к команде OrderByCommand = new RelayCommand(ExecuteOrderByCommand); } private void ExecuteOrderByCommand(object? parameter) { // Переключаем направление сортировки _isAsc = !_isAsc; ApplyFilters(); OnPropertyChanged(nameof(SortButtonText)); } /// <summary> /// Применение фильтров поиска и сортировки к полной коллекции. /// </summary> private void ApplyFilters() { var query = _allUsages.AsEnumerable(); // Фильтр по строке поиска (оборудование, пользователь, место) if (!string.IsNullOrWhiteSpace(_searchText)) { var text = _searchText.Trim().ToLowerInvariant(); query = query.Where(u => (u.Equipment?.Name ?? string.Empty).ToLowerInvariant().Contains(text) || (u.Equipment?.InventoryNumber?.ToString() ?? string.Empty).ToLowerInvariant().Contains(text) || (u.Employee?.Fio ?? string.Empty).ToLowerInvariant().Contains(text) || (u.Equipment?.Location?.Building ?? string.Empty).ToLowerInvariant().Contains(text) || (u.Equipment?.Location?.RoomNumber ?? string.Empty).ToLowerInvariant().Contains(text)); } // Фильтр по датам if (_filterStartDate.HasValue) { var d1 = _filterStartDate.Value.Date; query = query.Where(u => u.StartTime.Date >= d1); } if (_filterEndDate.HasValue) { var d2 = _filterEndDate.Value.Date; query = query.Where(u => u.StartTime.Date <= d2); } // Сортировка по названию оборудования (А-Я / Я-А) query = _isAsc ? query.OrderBy(u => u.Equipment == null ? string.Empty : u.Equipment.Name) : query.OrderByDescending(u => u.Equipment == null ? string.Empty : u.Equipment.Name); EquipmentUsages = new ObservableCollection<EquipmentUsage>(query.ToList()); } /// <summary> /// Удаление записи из локальной коллекции и обновление списка. /// </summary> public void RemoveUsage(int usageId) { var item = _allUsages.FirstOrDefault(u => u.Id == usageId); if (item != null) { _allUsages.Remove(item); ApplyFilters(); } } public event PropertyChangedEventHandler? PropertyChanged; protected void OnPropertyChanged([CallerMemberName] string? name = null) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name)); }