User.cs 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.IO;
  5. using System.Linq;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. using System.Windows;
  9. using System.Windows.Media;
  10. using System.Windows.Media.Imaging;
  11. namespace MyWpfApp.models
  12. {
  13. /// <summary>
  14. /// источник данных для страницы UserInfo
  15. /// </summary>
  16. public class User : INotifyPropertyChanged
  17. {
  18. public event PropertyChangedEventHandler PropertyChanged;
  19. //создаем объекты тех таблиц БД, с которыми необходмо работать (брать или добавлять данные)
  20. UserTable userTable;
  21. LoginedTable loginedTable;
  22. /// <summary>
  23. /// конструктор, который принимает аргумент. используется, если мы редактируем существующего пользователя
  24. /// </summary>
  25. /// <param name="loginedTable">Инфо о текущем пользователе</param>
  26. public User(LoginedTable loginedTable)
  27. {
  28. this.loginedTable = loginedTable;
  29. userTable = Globals.MyGlobalConnection.UserTable.FirstOrDefault(x => x.ID == loginedTable.ID);
  30. //получаем последнее изображение пользователя и помещаем его в источник данных для картинки на странице
  31. //OrderByDescending нужен, так как в EF не работает LastOrDefault
  32. UserImages userImage = Globals.MyGlobalConnection.UserImages.OrderByDescending(x=>x.ID).FirstOrDefault(x => x.IDUser == LoginedTable.ID);
  33. if (userImage == null)//если у пользователя в базе нет записей об изображении
  34. {
  35. imageSource = null;
  36. }
  37. else //помещаем картинку в IageSource по известному алгоритму
  38. {
  39. using (MemoryStream stream = new MemoryStream(userImage.Image))
  40. {
  41. BitmapImage BMimage = new BitmapImage();
  42. BMimage.BeginInit();
  43. BMimage.CacheOption = BitmapCacheOption.OnLoad;
  44. BMimage.StreamSource = stream;
  45. BMimage.EndInit();
  46. imageSource = BMimage;
  47. }
  48. }
  49. }
  50. /// <summary>
  51. /// конструктор без аргументов. Используется, если мы создаем нового пользователя
  52. /// </summary>
  53. public User()
  54. {
  55. loginedTable = new LoginedTable();
  56. userTable = new UserTable();
  57. imageSource = null;
  58. }
  59. /// <summary>
  60. /// свойство для пароля. переводит его строковое значение в хеш-код
  61. /// </summary>
  62. public string Password { set=> loginedTable.Password=value.GetHashCode(); }
  63. /// <summary>
  64. /// в get реализуется связь 1 к 1.
  65. /// </summary>
  66. public UserTable UserTable { get { userTable.ID = loginedTable.ID; return userTable; } set => userTable = value; }
  67. public LoginedTable LoginedTable { get => loginedTable; set => loginedTable = value; }
  68. string imagePath = "/Resources/zaglushka.png";//путь к заглушке. не меняется в ходе выполнения программы
  69. ImageSource imageSource;//источник данных для картинки.
  70. public object ImageBind
  71. {
  72. get
  73. {
  74. if (imageSource == null) return imagePath;//если изображения в базе нет, возвращаем путь к заглушке
  75. else return imageSource;//иначе возвращаем картинку из базы
  76. }
  77. set//стандартно с вызовом события обновления отрисовки
  78. {
  79. imageSource = (ImageSource)value;
  80. PropertyChanged.Invoke(this, new PropertyChangedEventArgs(nameof(ImageBind)));
  81. }
  82. }
  83. /// <summary>
  84. /// метод для перевода картинки из массива байт в BitmapImage. Связан со свойством ImageBind
  85. /// </summary>
  86. public void RefrashImage()
  87. {
  88. UserImages userImage = Globals.MyGlobalConnection.UserImages.OrderByDescending(x => x.ID).FirstOrDefault(x => x.IDUser == LoginedTable.ID);
  89. if (userImage == null)//если у пользователя в базе нет записей об изображении
  90. {
  91. ImageBind = null;
  92. }
  93. else //помещаем картинку в IageSource по известному алгоритму
  94. {
  95. using (MemoryStream stream = new MemoryStream(userImage.Image))
  96. {
  97. BitmapImage BMimage = new BitmapImage();
  98. BMimage.BeginInit();
  99. BMimage.CacheOption = BitmapCacheOption.OnLoad;
  100. BMimage.StreamSource = stream;
  101. BMimage.EndInit();
  102. ImageBind= BMimage;
  103. }
  104. }
  105. PropertyChanged.Invoke(this, new PropertyChangedEventArgs(nameof(ImageBind)));
  106. }
  107. }
  108. }