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


x:Class="SportShopApp.Catalog"

<Image Source="{Binding ImagePath}" Height="100" Width="120" Stretch="UniformToFill"/>

<Border x:Name="border"
        Background="{Binding RowBackground}"
        HorizontalAlignment="Stretch"
        BorderThickness="1"
        BorderBrush="Aqua">

<StackPanel Orientation="Horizontal">
    <TextBlock Text="{Binding PriceText}"
               Foreground="{Binding PriceForeground}"
               TextDecorations="{Binding PriceDecoration}"/>
    <TextBlock Text="{Binding FinalPriceText}"
               Foreground="Black"
               Margin="10 0 0 0"/>
</StackPanel>



using SportShopApp.Model;
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.IO;
using System.Linq;
using System.Windows;
using System.Windows.Media;
using System.Windows.TextDecorationCollection;

namespace SportShopApp
{
    public partial class Catalog : Window
    {
        private readonly int userMode;
        private List<Product> allProducts = new List<Product>();

        public Catalog(int mode)
        {
            InitializeComponent();

            userMode = mode;

            ConfigureUserInterface();
            LoadProviders();
            LoadProducts();

            cbProvider.SelectionChanged += (s, e) => ApplyFilters();
        }

        private void ConfigureUserInterface()
        {
            if (userMode == 0 || App.currentUser == null)
            {
                textName.Text = "Гость";
                spSort.Visibility = Visibility.Collapsed;
                btnAdd.Visibility = Visibility.Collapsed;
                btnDelete.Visibility = Visibility.Collapsed;
                btnOrder.Visibility = Visibility.Collapsed;
                return;
            }

            textName.Text = App.currentUser.FullName;

            string roleName = App.currentUser.Role.Name.ToLower();

            bool isManager = roleName.Contains("менеджер");
            bool isAdmin = roleName.Contains("администратор");

            spSort.Visibility = isManager || isAdmin
                ? Visibility.Visible
                : Visibility.Collapsed;

            btnOrder.Visibility = isManager || isAdmin
                ? Visibility.Visible
                : Visibility.Collapsed;

            btnAdd.Visibility = isAdmin
                ? Visibility.Visible
                : Visibility.Collapsed;

            btnDelete.Visibility = isAdmin
                ? Visibility.Visible
                : Visibility.Collapsed;
        }

        private void LoadProducts()
        {
            try
            {
                allProducts = App.DBCon.Product
                    .Include(p => p.Category)
                    .Include(p => p.ProductName)
                    .Include(p => p.Manufacturer)
                    .Include(p => p.Provider)
                    .Include(p => p.Measure)
                    .ToList();

                ApplyFilters();
            }
            catch (Exception ex)
            {
                MessageBox.Show(
                    $"Не удалось загрузить товары.\n\nОшибка: {ex.Message}",
                    "Ошибка загрузки",
                    MessageBoxButton.OK,
                    MessageBoxImage.Error);
            }
        }

        private void LoadProviders()
        {
            try
            {
                List<ProviderFilterItem> providers = App.DBCon.Provider
                    .OrderBy(p => p.Name)
                    .Select(p => new ProviderFilterItem
                    {
                        Id = p.Id,
                        Name = p.Name
                    })
                    .ToList();

                providers.Insert(0, new ProviderFilterItem
                {
                    Id = 0,
                    Name = "Все поставщики"
                });

                cbProvider.ItemsSource = providers;
                cbProvider.DisplayMemberPath = "Name";
                cbProvider.SelectedValuePath = "Id";
                cbProvider.SelectedIndex = 0;
            }
            catch
            {
                cbProvider.ItemsSource = null;
            }
        }

        private void ApplyFilters()
        {
            IEnumerable<Product> products = allProducts;

            string roleName = App.currentUser?.Role?.Name?.ToLower() ?? "";
            bool canUseFilters = roleName.Contains("менеджер") || roleName.Contains("администратор");

            if (canUseFilters)
            {
                string searchText = tbSearch.Text?.Trim().ToLower() ?? "";

                if (!string.IsNullOrWhiteSpace(searchText))
                {
                    products = products.Where(p =>
                        ContainsText(p.Article, searchText) ||
                        ContainsText(p.ProductName?.Name, searchText) ||
                        ContainsText(p.Category?.Name, searchText) ||
                        ContainsText(p.Description, searchText) ||
                        ContainsText(p.Manufacturer?.Name, searchText) ||
                        ContainsText(p.Provider?.Name, searchText) ||
                        ContainsText(p.Measure?.Name, searchText));
                }

                if (cbProvider.SelectedValue is int providerId && providerId != 0)
                {
                    products = products.Where(p => p.ProviderId == providerId);
                }

                if (rbUp.IsChecked == true)
                {
                    products = products.OrderBy(p => p.Amount);
                }
                else if (rbDown.IsChecked == true)
                {
                    products = products.OrderByDescending(p => p.Amount);
                }
            }

            lbCard.ItemsSource = products
                .Select(p => new ProductViewModel(p))
                .ToList();
        }

        private bool ContainsText(string value, string searchText)
        {
            return !string.IsNullOrWhiteSpace(value)
                   && value.ToLower().Contains(searchText);
        }

        private void tbSearch_TextChanged(object sender, System.Windows.Controls.TextChangedEventArgs e)
        {
            ApplyFilters();
        }

        private void rbUp_Click(object sender, RoutedEventArgs e)
        {
            ApplyFilters();
        }

        private void rbDown_Click(object sender, RoutedEventArgs e)
        {
            ApplyFilters();
        }

        private void btnBack_Click(object sender, RoutedEventArgs e)
        {
            App.currentUser = null;
            Close();
        }
    }

    public class ProviderFilterItem
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

    public class ProductViewModel
    {
        public ProductViewModel(Product product)
        {
            Article = product.Article;
            ProductName = product.ProductName;
            Category = product.Category;
            Manufacturer = product.Manufacturer;
            Provider = product.Provider;
            Measure = product.Measure;
            Description = product.Description;
            Price = product.Price;
            Discount = product.Discount;
            Amount = product.Amount;

            ImagePath = GetImagePath(product.Image);
        }

        public string Article { get; set; }
        public ProductName ProductName { get; set; }
        public Category Category { get; set; }
        public Manufacturer Manufacturer { get; set; }
        public Provider Provider { get; set; }
        public Measure Measure { get; set; }
        public string Description { get; set; }
        public decimal Price { get; set; }
        public byte Discount { get; set; }
        public int Amount { get; set; }
        public string ImagePath { get; set; }

        public string PriceText => $"Цена: {Price:N2} ₽";

        public string FinalPriceText
        {
            get
            {
                if (Discount <= 0)
                {
                    return "";
                }

                decimal finalPrice = Price * (100 - Discount) / 100;
                return $"Итоговая цена: {finalPrice:N2} ₽";
            }
        }

        public Brush PriceForeground => Discount > 0 ? Brushes.Red : Brushes.Black;

        public TextDecorationCollection PriceDecoration =>
            Discount > 0 ? TextDecorations.Strikethrough : null;

        public Brush RowBackground
        {
            get
            {
                if (Amount <= 0)
                {
                    return Brushes.LightBlue;
                }

                if (Discount > 15)
                {
                    return new SolidColorBrush((Color)ColorConverter.ConvertFromString("#2E8B57"));
                }

                return Brushes.White;
            }
        }

        private string GetImagePath(string image)
        {
            if (string.IsNullOrWhiteSpace(image))
            {
                return "/Resources/picture.png";
            }

            string fullPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, image);

            if (File.Exists(fullPath))
            {
                return fullPath;
            }

            if (File.Exists(image))
            {
                return image;
            }

            return "/Resources/picture.png";
        }
    }
}

this.ShowDialog();

this.Show();