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))); } } }