Bläddra i källkod

Добавил комментарии к некоторым классам для понимания сути происходящего

fly9024 11 månader sedan
förälder
incheckning
7c594e11da

+ 3 - 3
MyWpfApp/MyClass.cs

@@ -7,9 +7,9 @@ using System.Windows.Controls;
 
 namespace MyWpfApp
 {
-    internal class Globals
+    internal class Globals//зодержит все значения глобальных переменных
     {
-        public static Frame MyGlobalFrame;
-        public static Smerdova_PPEntities MyGlobalConnection;
+        public static Frame MyGlobalFrame;//глобальное значение для фрейма (используется при загрузке страниц)
+        public static Smerdova_PPEntities MyGlobalConnection;//глобальное подключение к базе данных (чтобы подключение поддерживалось всегда, пока программа работает)
     }
 }

+ 9 - 10
MyWpfApp/Pages/Auth.xaml.cs

@@ -24,36 +24,35 @@ namespace MyWpfApp.Pages
         List<User> users;
         public Auth()
         {
-            InitializeComponent();           
-            
-           // users = new List<User>() { new User { Name = "Ivan", Login = "123", Password = "123", Id = 1 }, new User() { Name = "Petr", Login = "456", Password = "456", Id = 2 } };
+            InitializeComponent();       
         }
 
         private void btnEnter_Click(object sender, RoutedEventArgs e)
         {
            
-            int pass = TxtPassword.Password.GetHashCode();
-            LoginedTable currentUser = Globals.MyGlobalConnection.LoginedTable.FirstOrDefault(x=>x.Login == TxtLogin.Text && x.Password == pass);
-            if (currentUser != null)
+            int pass = TxtPassword.Password.GetHashCode();//получаем хеш-код введенного в текстовое поле пароля
+            LoginedTable currentUser = Globals.MyGlobalConnection.LoginedTable.FirstOrDefault(x=>x.Login == TxtLogin.Text && x.Password == pass);//находим в базе записть с такими характеристиками
+            if (currentUser != null)//если такой пользователь существует
             {                
                     MessageBox.Show("Здравствуйте, "+ currentUser.Roles.Role);
-                if (currentUser.IDRole==1)
+                if (currentUser.IDRole==1)//если роль администратора
                 {
                     Globals.MyGlobalFrame.Navigate(new PageUserList());
                 }
-                else
+                else//если роль обычного пользователя
                 {
                     Globals.MyGlobalFrame.Navigate(new PageUserInfo(currentUser));  
                 }
                        
             }
-            else
+            else//если такой пользователь не существует
             {
                 MessageBox.Show("Вы не зарегистрированы");
             }
         }
 
-        private void Button_Click(object sender, RoutedEventArgs e)
+        
+        private void Button_Click(object sender, RoutedEventArgs e)//ничего полезного не несет. используется для демонстрации кнопки с шаблоном на странице
         {
             MessageBox.Show("Сработало");
         }

+ 2 - 3
MyWpfApp/Pages/PageForBindings.xaml.cs

@@ -17,12 +17,11 @@ using System.Windows.Shapes;
 namespace MyWpfApp.Pages
 {
     /// <summary>
-    /// Логика взаимодействия для PageForBindings.xaml
+    /// Логика взаимодействия для PageForBindings.xaml. Ничего полезного не несет. просто демонстрирует технологию привязки данных
     /// </summary>
     public partial class PageForBindings : Page
     {
-        //List<User> users = new List<User>() { new User { Name = "Ivan", Login = "123", Password = "123", Id = 1 }, new User() { Name = "Petr", Login = "456", Password = "456", Id = 2 } };
-       
+        
 
     public PageForBindings()
         {

+ 18 - 10
MyWpfApp/Pages/PageUserInfo.xaml.cs

@@ -25,7 +25,12 @@ namespace MyWpfApp.Pages
         User user;
 
 
-        int status;
+        int status;//флаг, который указывает, создаем мы нового пользователя или редактируем существующего
+
+        /// <summary>
+        /// конструктор с одним аргументом. если мы смотрим информацию о существующем пользователе
+        /// </summary>
+        /// <param name="currentUser">Пользователь, о котором мы хотим видеть информацию</param>
         public PageUserInfo(LoginedTable currentUser)
         {
             InitializeComponent();    
@@ -36,10 +41,13 @@ namespace MyWpfApp.Pages
             CBRoles.DisplayMemberPath = "Role";// что будет видно пользователю при отображении элементов списка
 
         }
+
+        /// <summary>
+        /// конструктор, если мы создаем нового пользователя
+        /// </summary>
         public PageUserInfo()
         {
-            InitializeComponent();
-            
+            InitializeComponent();            
            user = new User();
            DataContext = user;
             status = 0;//создаем нового пользователя
@@ -49,19 +57,19 @@ namespace MyWpfApp.Pages
         }
         private void BtnBack_Click(object sender, RoutedEventArgs e)
         {
-            Globals.MyGlobalFrame.GoBack();
+            Globals.MyGlobalFrame.GoBack();//так переходим на предыдущую страницу
         }
 
         private void BtnSave_Click(object sender, RoutedEventArgs e)
         {
-           if (status == 0)
+           if (status == 0)//если создаем нового пользователя, то добавляем информацию о нем в базу
             {
-                Globals.MyGlobalConnection.LoginedTable.Add(user.LoginedTable);
-                Globals.MyGlobalConnection.SaveChanges();                
-                Globals.MyGlobalConnection.UserTable.Add(user.UserTable);
+                Globals.MyGlobalConnection.LoginedTable.Add(user.LoginedTable);//сначала создаем LoginedTable, т.к. она для нашей связи 1 к 1 первичный ключ
+                Globals.MyGlobalConnection.SaveChanges();//для того, чтобы у user.LoginedTable появился ID, который создается на стороне SQL-сервера
+                Globals.MyGlobalConnection.UserTable.Add(user.UserTable);//добавляем вторую таблицу (которая содержит внешний ключ)
             }
-           Globals.MyGlobalConnection.SaveChanges();
-            MessageBox.Show("Сохранено");
+           Globals.MyGlobalConnection.SaveChanges();//сохраняем изменения в любом случае (ка при добавлении, так и при редактировании)
+            MessageBox.Show("Сохранено");//информационное сообщение
         }
     }
 }

+ 11 - 10
MyWpfApp/Pages/PageUserList.xaml.cs

@@ -21,7 +21,7 @@ namespace MyWpfApp.Pages
     /// </summary>
     public partial class PageUserList : Page
     {
-        UserListModel users = new UserListModel();
+        UserListModel users = new UserListModel();//источник данных
         public PageUserList()
         {
             InitializeComponent();           
@@ -30,26 +30,27 @@ namespace MyWpfApp.Pages
 
        
 
-        private void Button_Click(object sender, RoutedEventArgs e)
+        private void Button_Click(object sender, RoutedEventArgs e)//редактирование существующего пользователя
         {
-            Button btn = (Button)sender;
-            int ID = Convert.ToInt32(btn.Uid);
-            LoginedTable user = Globals.MyGlobalConnection.LoginedTable.FirstOrDefault(x=>x.ID == ID);
-            if (user != null)
+            Button btn = (Button)sender;//понимаем, какая именно кнопка из шаблона вызвала событие
+            int ID = Convert.ToInt32(btn.Uid);//к полю Uid кнопки из списка привязан ID записи из базы
+            LoginedTable user = Globals.MyGlobalConnection.LoginedTable.FirstOrDefault(x=>x.ID == ID);//получаем эту запись по известному ID
+            if (user != null)//на вский случай проверяем, что запись существует. а то мало ли чего
             {
-                Globals.MyGlobalFrame.Navigate(new PageUserInfo(user));
+                Globals.MyGlobalFrame.Navigate(new PageUserInfo(user));//переход на страницу в режиме редактирования
             }
         }
 
-        private void BtnAddUser_Click(object sender, RoutedEventArgs e)
+        private void BtnAddUser_Click(object sender, RoutedEventArgs e)//переход на страницу добавления нового пользователя
         {
-            Globals.MyGlobalFrame.Navigate(new PageUserInfo());
+            Globals.MyGlobalFrame.Navigate(new PageUserInfo());//переход на страницу в режиме добавления
+            }
         }
 
        
         
 
-        private void btnResetFilters_Click(object sender, RoutedEventArgs e)
+        private void btnResetFilters_Click(object sender, RoutedEventArgs e)//сбрасывает все фильтры
         {
             users.Surname = null;
             users.IdRole = 0;

+ 11 - 7
MyWpfApp/models/ImageBindings.cs

@@ -8,17 +8,26 @@ using System.Windows.Media;
 
 namespace MyWpfApp.models
 {
+/// <summary>
+/// Data Context для работы с изображениями 
+/// </summary>
     internal class ImageBindings:INotifyPropertyChanged
     {
+        //событие изменения свойства (нужно для оповещения необходимости отрисовки в XAML)
+        public event PropertyChangedEventHandler PropertyChanged;
+        
+        //поле, которое содержит путь к картинке
         string path; 
-        public string ImgPath //для загрузки картинки при известном пути
+
+        public string ImgPath //свойство, которое инкапсулирует поле Path. Используется для загрузки картинки при известном пути
         { get => path; set
             {
                 path = value;
-                PropertyChanged.Invoke(this, new PropertyChangedEventArgs(nameof(ImgPath)));
+                PropertyChanged.Invoke(this, new PropertyChangedEventArgs(nameof(ImgPath)));//оповещаем о необходимости изменить отрисовку
             }
         }
 
+        ImageSource imageSource;//поле, которое содержит ImageSource (для соответствующего свойства у Image в XAML)
         public ImageSource ImageSource //для загрузки картинки из массива байт
         { get => imageSource; set
             {
@@ -26,10 +35,5 @@ namespace MyWpfApp.models
                 PropertyChanged.Invoke(this, new PropertyChangedEventArgs(nameof(ImageSource)));
             }
          }
-
-        ImageSource imageSource;
-
-
-        public event PropertyChangedEventHandler PropertyChanged;
     }
 }

+ 24 - 7
MyWpfApp/models/User.cs

@@ -6,23 +6,40 @@ using System.Threading.Tasks;
 
 namespace MyWpfApp.models
 {
+    /// <summary>
+    /// источник данных для страницы UserInfo
+    /// </summary>
     public class User
     {        
+        //создаем объекты тех таблиц БД, с которыми необходмо работать (брать или добавлять данные)
         UserTable userTable;
         LoginedTable loginedTable;
 
+        /// <summary>
+        /// конструктор, который принимает аргумент. используется, если мы редактируем существующего пользователя
+        /// </summary>
+        /// <param name="loginedTable">Инфо о текущем пользователе</param>
         public User(LoginedTable loginedTable)
-        {           
-            LoginedTable = loginedTable;
-            UserTable = Globals.MyGlobalConnection.UserTable.FirstOrDefault(x => x.ID == loginedTable.ID);
+        {
+            this.loginedTable = loginedTable;
+            userTable = Globals.MyGlobalConnection.UserTable.FirstOrDefault(x => x.ID == loginedTable.ID);
         }
+        /// <summary>
+        /// конструктор без аргументов. Используется, если мы создаем нового пользователя
+        /// </summary>
          public User()
-        { 
-            LoginedTable = new LoginedTable();
-            UserTable = new UserTable();  
+        {
+            loginedTable = new LoginedTable();
+            userTable = new UserTable();  
         }
 
-        public string Password { set=>LoginedTable.Password=value.GetHashCode(); }
+        /// <summary>
+        /// свойство для пароля. переводит его строковое значение в хеш-код
+        /// </summary>
+        public string Password { set=> loginedTable.Password=value.GetHashCode(); }
+        /// <summary>
+        /// в get реализуется связь 1 к 1.
+        /// </summary>
         public UserTable UserTable { get { userTable.ID = loginedTable.ID; return userTable; } set => userTable = value; }
         public LoginedTable LoginedTable { get => loginedTable; set => loginedTable = value; }
     }

+ 34 - 9
MyWpfApp/models/UserListModel.cs

@@ -9,48 +9,73 @@ using System.Windows;
 
 namespace MyWpfApp.models
 {
+
+    /// <summary>
+    /// источник данных для списка пользователей на соответствующей странице
+    /// </summary>
     internal class UserListModel:INotifyPropertyChanged
     {
 
-        List<UserTable> users;
+        List<UserTable> users;//возвращаемый в ItemsSource список пользователей
 
-        List<Roles> roles;
+        List<Roles> roles;//список ролей (загружается в соответствующий ComboBox)
         int idRole;
         string surname;
 
+
+        /// <summary>
+        /// задаем в конструкторе значения по умолчанию
+        /// </summary>
         public UserListModel()
         {
-            users = Globals.MyGlobalConnection.UserTable.ToList();
-            roles = Globals.MyGlobalConnection.Roles.ToList();
-            roles.Add(new Roles() { ID = 0, Role = "Все роли" }); 
-            idRole = 0;
+            users = Globals.MyGlobalConnection.UserTable.ToList();//список из базы
+            roles = Globals.MyGlobalConnection.Roles.ToList();//список из базы
+            roles.Add(new Roles() { ID = 0, Role = "Все роли" }); //добавляем элемент для списка в ComboBox (в базе его нет)
+            idRole = 0;//значение первого элемента списка
         }
 
+        /// <summary>
+        /// свойство для списка пользователей
+        /// </summary>
         public List<UserTable> Users { get=>users; set
                 {
                     users = value;
-                    PropertyChanged.Invoke(this, new PropertyChangedEventArgs("Users"));                
+                    PropertyChanged.Invoke(this, new PropertyChangedEventArgs(nameof(Users)));                
                 }
             }
 
+        /// <summary>
+        /// свойство для списка ролей. Его мы не изменяем, а только получаем (поэтому нет set)
+        /// </summary>
         public List<Roles> Roles { get => roles; }
+
+        /// <summary>
+        /// свойство для изменения ID роли. срабатывает при изменении пункта из ComboBox на странице
+        /// </summary>
         public int IdRole { get => idRole; 
             set 
                 {
                 idRole = value;
-                PropertyChanged.Invoke(this, new PropertyChangedEventArgs("IdRole"));
+                PropertyChanged.Invoke(this, new PropertyChangedEventArgs(nameof(IdRole)));
                 AllFilters();
                 }
         }
 
+        /// <summary>
+        /// по аналогии с предыдущим срабатывает при изменении текстового поля на странице
+        /// </summary>
         public string Surname { get => surname; set
             {
                 surname = value;
-                PropertyChanged.Invoke(this, new PropertyChangedEventArgs("Surname"));
+                PropertyChanged.Invoke(this, new PropertyChangedEventArgs(nameof(Surname)));
                 AllFilters();                
             }
         }
 
+
+        /// <summary>
+        /// метод, в котором применяются сразу все доступные фильтры
+        /// </summary>
         void AllFilters()
         {
             List<UserTable> userFiltered = Globals.MyGlobalConnection.UserTable.ToList();