C#

Как добавить корзину в WPF-проекте на C#

Корзина в WPF-проекте на C# обычно делается через список позиций: товар, количество, цена и итог по строке. Для интерфейса удобно использовать ObservableCollection<CartItem>, потому что WPF может автоматически обновлять список, когда вы добавляете или удаляете элементы. Начинать лучше не с базы данных, а с модели и логики добавления

Модель товара

public class Product
{
    public int Id { get; set; }
    public string Title { get; set; } = "";
    public decimal Price { get; set; }
}

Товар — это то, что есть в каталоге. В корзине нужна отдельная модель, потому что там появляется количество

public class CartItem
{
    public Product Product { get; set; } = new();
    public int Quantity { get; set; }
    public decimal Total => Product.Price * Quantity;
}

Total считается из цены и количества

Список корзины

В классе окна или ViewModel:

using System.Collections.ObjectModel;

public ObservableCollection<CartItem> CartItems { get; } = new();

ObservableCollection сообщает интерфейсу, что список изменился. Для WPF это важнее обычного List<T>, потому что экран должен обновляться после добавления товара

Добавление товара

public void AddToCart(Product product)
{
    CartItem? item = CartItems.FirstOrDefault(x => x.Product.Id == product.Id);

    if (item == null)
    {
        CartItems.Add(new CartItem
        {
            Product = product,
            Quantity = 1
        });
    }
    else
    {
        item.Quantity++;
    }
}

Если товара еще нет в корзине, создаем новую строку. Если уже есть, увеличиваем количество

Пересчет общей суммы

public decimal CartTotal => CartItems.Sum(x => x.Total);

В реальном WPF-приложении для автоматического обновления суммы понадобится уведомление об изменениях, например через INotifyPropertyChanged. Но для первого шага важно понять саму логику: сумма корзины складывается из итогов строк

Отдельно следите за тем, где хранится итог. Не стоит записывать общую сумму в отдельную переменную и менять ее в разных местах без контроля. Так легко получить рассинхрон: товар удалили, а сумма осталась старой. Надежнее пересчитывать итог из CartItems или обновлять его строго в одном методе после каждого изменения корзины

Привязка в XAML

Упрощенный пример:

<ListBox ItemsSource="{Binding CartItems}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Product.Title}" />
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

Если используете MVVM, у окна должен быть DataContext, в котором есть CartItems. Если делаете учебный пример без MVVM, можно временно задать DataContext = this;, но для серьезного проекта лучше ViewModel

Что делать с удалением

Удаление позиции:

public void RemoveFromCart(CartItem item)
{
    CartItems.Remove(item);
}

Для пользовательского интерфейса обычно нужны две команды: удалить строку полностью и уменьшить количество на один. Это разные действия. Если пользователь нажал «минус», строка исчезает только когда количество стало нулевым. Если нажал «удалить», позиция убирается сразу. Такое разделение делает корзину понятнее

Уменьшение количества:

if (item.Quantity > 1)
{
    item.Quantity--;
}
else
{
    CartItems.Remove(item);
}

Частые ошибки

Первая ошибка — хранить в корзине только Product, без количества. Вторая — использовать List<T> и удивляться, почему интерфейс не обновляется. Третья — смешивать цену товара и итог строки. Четвертая — сразу подключать базу данных, не проверив корзину на тестовых данных

Мини-задача: создайте три товара в памяти, кнопку «Добавить в корзину» и список корзины. При повторном добавлении одного товара увеличивайте количество, а не создавайте дубликат строки

Что почитать дальше по C#

Что почитать дальше по C#

Если нужен общий маршрут по теме, откройте рубрику C#. Для соседних задач пригодятся эти разборы:

Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные

Настройки cookie

0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x