using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Imaging;
namespace MyWpfApp.models
{
///
/// источник данных для страницы UserInfo
///
public class User : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
//создаем объекты тех таблиц БД, с которыми необходмо работать (брать или добавлять данные)
UserTable userTable;
LoginedTable loginedTable;
///
/// конструктор, который принимает аргумент. используется, если мы редактируем существующего пользователя
///
/// Инфо о текущем пользователе
public User(LoginedTable loginedTable)
{
this.loginedTable = loginedTable;
userTable = Globals.MyGlobalConnection.UserTable.FirstOrDefault(x => x.ID == loginedTable.ID);
//получаем последнее изображение пользователя и помещаем его в источник данных для картинки на странице
//OrderByDescending нужен, так как в EF не работает LastOrDefault
UserImages userImage = Globals.MyGlobalConnection.UserImages.OrderByDescending(x=>x.ID).FirstOrDefault(x => x.IDUser == LoginedTable.ID);
if (userImage == null)//если у пользователя в базе нет записей об изображении
{
imageSource = null;
}
else //помещаем картинку в IageSource по известному алгоритму
{
using (MemoryStream stream = new MemoryStream(userImage.Image))
{
BitmapImage BMimage = new BitmapImage();
BMimage.BeginInit();
BMimage.CacheOption = BitmapCacheOption.OnLoad;
BMimage.StreamSource = stream;
BMimage.EndInit();
imageSource = BMimage;
}
}
}
///
/// конструктор без аргументов. Используется, если мы создаем нового пользователя
///
public User()
{
loginedTable = new LoginedTable();
userTable = new UserTable();
imageSource = null;
}
///
/// свойство для пароля. переводит его строковое значение в хеш-код
///
public string Password { set=> loginedTable.Password=value.GetHashCode(); }
///
/// в get реализуется связь 1 к 1.
///
public UserTable UserTable { get { userTable.ID = loginedTable.ID; return userTable; } set => userTable = value; }
public LoginedTable LoginedTable { get => loginedTable; set => loginedTable = value; }
string imagePath = "/Resources/zaglushka.png";//путь к заглушке. не меняется в ходе выполнения программы
ImageSource imageSource;//источник данных для картинки.
public object ImageBind
{
get
{
if (imageSource == null) return imagePath;//если изображения в базе нет, возвращаем путь к заглушке
else return imageSource;//иначе возвращаем картинку из базы
}
set//стандартно с вызовом события обновления отрисовки
{
imageSource = (ImageSource)value;
PropertyChanged.Invoke(this, new PropertyChangedEventArgs(nameof(ImageBind)));
}
}
///
/// метод для перевода картинки из массива байт в BitmapImage. Связан со свойством ImageBind
///
public void RefrashImage()
{
UserImages userImage = Globals.MyGlobalConnection.UserImages.OrderByDescending(x => x.ID).FirstOrDefault(x => x.IDUser == LoginedTable.ID);
if (userImage == null)//если у пользователя в базе нет записей об изображении
{
ImageBind = null;
}
else //помещаем картинку в IageSource по известному алгоритму
{
using (MemoryStream stream = new MemoryStream(userImage.Image))
{
BitmapImage BMimage = new BitmapImage();
BMimage.BeginInit();
BMimage.CacheOption = BitmapCacheOption.OnLoad;
BMimage.StreamSource = stream;
BMimage.EndInit();
ImageBind= BMimage;
}
}
PropertyChanged.Invoke(this, new PropertyChangedEventArgs(nameof(ImageBind)));
}
}
}