Загрузка данных


using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using ChudoObuv.ApplicationData;

namespace ChudoObuv.Pages
{
    public partial class ProductsPage : Page
    {
        private List<Products> _all;   // все товары из БД

        public ProductsPage()
        {
            InitializeComponent();

            // гость и клиент (RoleId = 3) — только просмотр
            if (AppConnect.CurrentUser == null || AppConnect.CurrentUser.RoleId == 3)
                filterPanel.Visibility = Visibility.Collapsed;

            // удалять может только админ (RoleId = 1)
            if (AppConnect.CurrentUser?.RoleId != 1)
                btnDelete.Visibility = Visibility.Collapsed;

            // сортировка
            cmbSort.Items.Add("Без сортировки");
            cmbSort.Items.Add("Цена по возрастанию");
            cmbSort.Items.Add("Цена по убыванию");
            cmbSort.SelectedIndex = 0;

            // фильтр по категориям из таблицы Categories
            cmbFilter.Items.Add("Все категории");
            foreach (var c in AppConnect.model01.Categories.ToList())
                cmbFilter.Items.Add(c.CategoryName);
            cmbFilter.SelectedIndex = 0;

            LoadProducts();
        }

        private void LoadProducts()
        {
            _all = AppConnect.model01.Products.ToList();
            Apply();
        }

        // поиск + фильтр + сортировка вместе
        private void Apply()
        {
            if (_all == null) return;   // события срабатывают ещё до загрузки

            var list = _all.AsEnumerable();

            string q = txtSearch.Text.Trim().ToLower();
            if (q != "")
                list = list.Where(p => p.Name.ToLower().Contains(q) ||
                                       (p.Description ?? "").ToLower().Contains(q));

            if (cmbFilter.SelectedIndex > 0)
            {
                string cat = cmbFilter.SelectedItem.ToString();
                list = list.Where(p => p.Subcategories.Categories.CategoryName == cat);
            }

            if (cmbSort.SelectedIndex == 1) list = list.OrderBy(p => p.Price);
            if (cmbSort.SelectedIndex == 2) list = list.OrderByDescending(p => p.Price);

            listProducts.ItemsSource = list.ToList();
        }

        private void txtSearch_TextChanged(object sender, TextChangedEventArgs e) => Apply();
        private void cmb_SelectionChanged(object sender, SelectionChangedEventArgs e) => Apply();

        private void btnDelete_Click(object sender, RoutedEventArgs e)
        {
            if (!(listProducts.SelectedItem is Products p))
            {
                MessageBox.Show("Выберите товар!");
                return;
            }

            // если товар уже есть в заказах — удалять нельзя
            if (AppConnect.model01.OrderItems.Any(oi => oi.StockItems.ProductId == p.Id))
            {
                MessageBox.Show("Товар есть в заказах, удалить нельзя.");
                return;
            }

            if (MessageBox.Show($"Удалить «{p.Name}»?", "Подтверждение",
                    MessageBoxButton.YesNo) != MessageBoxResult.Yes) return;

            try
            {
                AppConnect.model01.StockItems.RemoveRange(p.StockItems.ToList()); // сначала остатки
                AppConnect.model01.Products.Remove(p);
                AppConnect.model01.SaveChanges();
                LoadProducts();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void btnExit_Click(object sender, RoutedEventArgs e)
        {
            AppConnect.CurrentUser = null;
            AppFrame.frmMain.Navigate(new AuthorizationPage());
        }
    }
}