Делаю приложение магазин продуктов в WPF с SQL. Пытаюсь сделать корзину (есть класс BasketConstructor, в котором есть ObservableCollection, в которую я записываю id товаров и далее их вывожу через запросы. Проблема в том что у меня не получается сделать связку данных между классами. Пытался сделать еще один класс, в котором уже вызывать методы BasketConstructor (у этого класса (DataTransmission) в конструкторе беру объект класса BasketConstructor)). Как сделать связку данных... жду помощи кодом пожалуйста...
BasketConstructor:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel;
using System.Collections.ObjectModel;
using System.Data.SqlClient;
using System.Windows;
namespace Practice
{
internal class BasketConstructor : INotifyPropertyChanged
{
DataBase dataBase = new DataBase();
public ObservableCollection<int> idContainer { get { return IdContainer; }
set { IdContainer = value; OnPropertyChanged("idContainer"); } }
private ObservableCollection<int> IdContainer = new ObservableCollection<int>();
public float SummPrice { get { return SummBasketCalculation(); } set { SummPrice = value; OnPropertyChanged("SummPrice"); } }
//Сделать кнопку покупки (запись в бд всех товаров и удаление)
public void AddProduct(int id)
{
idContainer.Add(id);
}
private int SummBasketCalculation()
{
int summ = 0;
SqlDataReader reader = null;
try
{
foreach (int i in idContainer)
{
string querystring = $"select Цена from Товар where Код_Товара = '{i}'";
SqlCommand command = new SqlCommand(querystring, dataBase.GetConnection());
dataBase.openConnection();
reader = command.ExecuteReader();
while (reader.Read())
{
summ += Convert.ToInt32(reader["Цена"]);
}
}
return summ;
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
return 0;
}
finally
{
if (reader != null && !reader.IsClosed)
reader.Close();
dataBase.closeConnection();
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler propertyChangedEvent = PropertyChanged;
if (propertyChangedEvent != null)
{
propertyChangedEvent(this, new PropertyChangedEventArgs(propertyName));
}
}
}
}
DataTransmission:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Practice
{
internal class DataTransmission
{
BasketConstructor BasketConstructor;
public DataTransmission(BasketConstructor basketConstructor)
{
BasketConstructor = basketConstructor;
}
public void AddProduct(int id)
{
BasketConstructor.AddProduct(id);
}
}
}
Basket:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Data.SqlClient;
using System.IO;
using System.Collections.ObjectModel;
namespace Practice
{
/// <summary>
/// Логика взаимодействия для Basket.xaml
/// </summary>
public partial class Basket : Window
{
BasketConstructor bconstructor = new BasketConstructor();
DataBase dataBase = new DataBase();
ObservableCollection<int> id { get { return bconstructor.idContainer; } }
public Basket()
{
InitializeComponent();
basketGrid.Background = new SolidColorBrush(Color.FromRgb(223, 229, 229));
Loaded += Basket_Loaded;
}
private void Basket_Loaded(object sender, RoutedEventArgs e)
{
SqlDataReader reader = null;
try
{
foreach (int i in bconstructor.idContainer)
{
string querystring = $"select Название, Цена, Картинка from Товар where Код_Товара = '{i}'";
SqlCommand command = new SqlCommand(querystring, dataBase.GetConnection());
dataBase.openConnection();
reader = command.ExecuteReader();
while (reader.Read())
{
byte[] imageBytes = (byte[])reader["Картинка"];
basketItems.Items.Add(new
{
ImageItem = ImgFromBytes(imageBytes),
TextItem = Convert.ToString(reader["Название"]),
PriceItem = Convert.ToString(reader["Цена"]) + "₽"
});
}
}
}
catch (Exception ex)
{
// MessageBox.Show(ex);
}
finally
{
if (reader != null && !reader.IsClosed)
reader.Close();
dataBase.closeConnection();
}
//basketItems.ItemsSource = new[] { new и тд}
}
private static BitmapImage ImgFromBytes(byte[] arr)
{
var image = new BitmapImage();
using (var mem = new MemoryStream(arr))
{
mem.Position = 0;
image.BeginInit();
image.CreateOptions = BitmapCreateOptions.PreservePixelFormat;
image.CacheOption = BitmapCacheOption.OnLoad;
image.UriSource = null;
image.StreamSource = mem;
image.EndInit();
}
image.Freeze();
return image;
}
private void Back_Button_Click(object sender, RoutedEventArgs e)
{
UserPage userPage = new UserPage();
userPage.Show();
Close();
}
}
}
Сама запись в ObservableCollection:
private void One_Bread_Click(object sender, RoutedEventArgs e)
{
DataTransmission dataTransmission = new DataTransmission(bconstruct);
dataTransmission.AddProduct(1);
}