Загрузка данных
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();