Эх сурвалжийг харах

Сортировка и фильтрация по чертам характера +комментарии

МухинаЛВ 3 долоо хоног өмнө
parent
commit
b4262cf60e

+ 2 - 2
AvaloniaApplication12/ViewModels/PageAddCatVM.cs

@@ -62,9 +62,9 @@ namespace AvaloniaApplication12.ViewModels
         }
 
         // метод для удаления черты характера из списка выбранных черт характера
-        public void DeleteTrait(int id)
+        public void DeleteTrait(TraitCatTable deleteTrait)
         {
-            NewCat.TraitCatTables.Remove(NewCat.TraitCatTables.FirstOrDefault(x => x.Id == id));
+            NewCat.TraitCatTables.Remove(deleteTrait);
             TraitCatTables = NewCat.TraitCatTables.ToList();
             this.RaisePropertyChanged(nameof(Traits));
         }

+ 63 - 4
AvaloniaApplication12/ViewModels/PageShowCatsVM.cs

@@ -46,7 +46,8 @@ namespace AvaloniaApplication12.ViewModels
         }
 
 #region Поиск, сортировка и фильтрация
-                
+
+        // поисковая строка с поиском по имени кота:                
         string _searchCat; // поле для хранения текста, введенного в поисковую строку
         public string SearchCat // свойство для обращения к переменной, хранящей текст из поисковой строки
         { 
@@ -57,13 +58,14 @@ namespace AvaloniaApplication12.ViewModels
                 AllFilters(); // вызываем метод для фильтрации списка по выбранным параметрам
             }
         }
-        
+
+        // фильтрация по породе кота:       
         // список со всеми породами кота, в который добавлен элемент "Все породы" для сброса фильтрации
         List<BreedTable> _breedFilter = [new BreedTable() { Id = 0, Breed = "все породы" }, .. MainWindowViewModel.myConnection.BreedTables.ToList()];
         public List<BreedTable> BreedFilter { get => _breedFilter;} // свойство для обращению к списку со всеми породами
        
         BreedTable _selectedBreed = null;  // поле для хранения выбранной породы из списка для фильтрации по породам
-        public BreedTable SelectedBreed // свойство дял обращения к полю с выбранной породой
+        public BreedTable SelectedBreed // свойство для обращения к полю с выбранной породой
         {
             get
             {
@@ -80,6 +82,7 @@ namespace AvaloniaApplication12.ViewModels
             }
         }
 
+        // флажок с выбором только котов мужского пола:
         bool _checkCat = false; // поле для хранения значения флажка для отображения только котов мужского пола (по умолчанию флажок не выбран)
         public bool CheckCat  // свойство для обращения к полю, хранящему значение флажка
         {
@@ -91,6 +94,25 @@ namespace AvaloniaApplication12.ViewModels
             }
         }
 
+        // сортировка:
+        int _selectedSort = 0;// поле для хранения выбранного параметра сортировки (по умолчанию будет стоять параметр "Без сортировки")
+        public int SelectedSort { get => _selectedSort; set { _selectedSort = value; AllFilters(); } }// свойство, взаимодействующее с полем для хранения выбранного параметра сортировки
+             
+        bool _isVisibleSort = false; // поле, которое хранит значение видимости панели, где происходит выбор сортировки по возрастанию или по убыванию
+        public bool IsVisibleSort { get => _isVisibleSort; set => this.RaiseAndSetIfChanged(ref _isVisibleSort,value); } // свойство, взаимодействующее с полем, хранящем значение видимости панели
+       
+        bool _sortUp = true; // поле, которое хранит значение параметра сортировки по возрастанию (изначально будет автоматически выбрано)
+        public bool SortUp { get => _sortUp; set { this.RaiseAndSetIfChanged(ref _sortUp, value); AllFilters(); } } // свойство, взаимодействующее с полем, хранящем значение параметра сортировки по возрастанию
+
+        bool _sortDown = false;// поле, которое хранит значение параметра сортировки по убыванию
+        public bool SortDown { get => _sortDown; set { this.RaiseAndSetIfChanged(ref _sortDown, value); AllFilters(); } } // свойство, взаимодействующее с полем, хранящем значение параметра сортировки по убыванию
+
+        // фильтрация по чертам характера кота:
+        public List<TraitTable> TraitFilter => MainWindowViewModel.myConnection.TraitTables.ToList(); // список с чертами характера кота
+
+        TraitTable _selectedTraitFilter = null; // поле для хранения выбранной черты характера из списка для фильтрации по породам 
+        public TraitTable SelectedTraitFilter { get => _selectedTraitFilter; set { _selectedTraitFilter = value; AllFilters(); } } // свойство для обращения к полю с выбранной чертой характера
+
         // метод для фильтрации всего
         void AllFilters()
         {         
@@ -115,7 +137,44 @@ namespace AvaloniaApplication12.ViewModels
             if (_selectedBreed!=null && _selectedBreed.Id!=0)
             {
                 CatList = CatList.Where(x => x.Breed==_selectedBreed).ToList();
-            }            
+            }
+
+            // список черт характера
+            if (_selectedTraitFilter!=null)
+            {
+                CatList = CatList.Where(x=>x.TraitCatTables.Any(y=>y.Trait.Id ==_selectedTraitFilter.Id)).ToList();
+                // Any() возвращает true, если в коллекции есть хот бы один элемент, удовлетворяющий условию
+            }
+
+            // сортировка
+            switch(_selectedSort)
+            {
+                case 0:  // если выбран параметр Без сортировки
+                    IsVisibleSort = false; 
+                    break;
+                case 1: // если выбран параметр по весу
+                    IsVisibleSort = true; 
+                    if (_sortDown)
+                    {
+                        CatList = CatList.OrderByDescending(x => x.Weight).ToList();
+                    }
+                    else
+                    {
+                        CatList = CatList.OrderBy(x => x.Weight).ToList();  
+                    }                                   
+                    break;
+                case 2: // если выбран параметр по дате рождения
+                    IsVisibleSort = true;
+                    if (_sortDown)
+                    {
+                        CatList = CatList.OrderByDescending(x => x.Birthday).ToList();
+                    }
+                    else
+                    {
+                        CatList = CatList.OrderBy(x => x.Birthday).ToList();
+                    }                   
+                    break;
+            }           
         }
 #endregion
     }

+ 1 - 1
AvaloniaApplication12/Views/PageAddcat.axaml

@@ -62,7 +62,7 @@
 					<DataTemplate>
 						<StackPanel>
 							<TextBlock Text="{Binding Trait.Trait}"></TextBlock>
-							<Button Command="{Binding $parent[UserControl].((vm:PageAddCatVM)DataContext).DeleteTrait}" CommandParameter="{Binding Id}">Удалить</Button>
+							<Button Command="{Binding $parent[UserControl].((vm:PageAddCatVM)DataContext).DeleteTrait}" CommandParameter="{Binding}">Удалить</Button>
 						</StackPanel>
 					</DataTemplate>
 				</ListBox.ItemTemplate>

+ 31 - 10
AvaloniaApplication12/Views/PageShowCats.axaml

@@ -13,6 +13,7 @@
 			<RowDefinition Height="8*"></RowDefinition>
 		</Grid.RowDefinitions>
 		<Button Command="{Binding ToPageAddCat}">Добавить кота</Button>
+		
 		<StackPanel Grid.Row="1" Orientation="Horizontal">			
 			<StackPanel>
 				<TextBox Watermark="Введите имя кота" Text="{Binding SearchCat}" Height="50" VerticalAlignment="Top"></TextBox>				
@@ -24,31 +25,51 @@
 						<TextBlock Text="{Binding Breed}"></TextBlock>
 					</DataTemplate>
 				</ComboBox.ItemTemplate>
-			</ComboBox>			
+			</ComboBox>
+			<StackPanel>
+				<!--Сортировка-->
+				<ComboBox SelectedIndex="{Binding SelectedSort}">
+					<ComboBoxItem>Без сортировки</ComboBoxItem>
+					<ComboBoxItem>По весу</ComboBoxItem>
+					<ComboBoxItem>По дате рождения</ComboBoxItem>
+				</ComboBox>
+				<StackPanel IsVisible="{Binding IsVisibleSort}">
+					<RadioButton Content="По возрастанию" IsChecked="{Binding SortUp}"/>
+					<RadioButton Content="По убыванию" IsChecked="{Binding SortDown}"/>
+				</StackPanel>
+			</StackPanel>
+			<ComboBox ItemsSource="{Binding TraitFilter}" SelectedItem="{Binding SelectedTraitFilter}">
+				<ComboBox.ItemTemplate>
+					<DataTemplate>
+						<TextBlock Text="{Binding Trait}"></TextBlock>
+					</DataTemplate>
+				</ComboBox.ItemTemplate>
+			</ComboBox>
 		</StackPanel>
+		
 		<ListBox ItemsSource="{Binding CatList}" Grid.Row="2" SelectionMode="Multiple">
-			<!--<ListBox.ItemsPanel>
+			<ListBox.ItemsPanel>
 				<ItemsPanelTemplate>
 					<WrapPanel></WrapPanel>
 				</ItemsPanelTemplate>
-			</ListBox.ItemsPanel>-->
+			</ListBox.ItemsPanel>
 			<ListBox.ItemTemplate>
 				<DataTemplate>
 					<Border BorderThickness="2" BorderBrush="Green">
-						<StackPanel>
-							<TextBlock Text="{Binding Name}"></TextBlock>
-							<TextBlock Text="{Binding Weight}"></TextBlock>
+						<StackPanel Height="450" Width="350">
+							<TextBlock Text="{Binding Name, StringFormat=Имя кота: {0}}"></TextBlock>
+							<TextBlock Text="{Binding Weight, StringFormat='\{0} - вес кота'}"></TextBlock>
 							<TextBlock Text="{Binding Birthday, StringFormat=D}"></TextBlock>
-							<TextBlock Text="{Binding Breed.Breed}"></TextBlock>
+							<TextBlock Text="{Binding Breed.Breed}" TextWrapping="Wrap"></TextBlock>
 							<TextBlock Text="{Binding Owner.FIO}" TextWrapping="Wrap"></TextBlock>
-							<!--<TextBlock Text="{Binding CatTraits}"></TextBlock>-->
-							<ItemsRepeater ItemsSource="{Binding TraitCatTables}">
+							<TextBlock Text="{Binding CatTraits}" TextWrapping="Wrap"></TextBlock>
+							<!--<ItemsRepeater ItemsSource="{Binding TraitCatTables}">
 								<ItemsRepeater.ItemTemplate>
 									<DataTemplate>
 										<TextBlock Text="{Binding Trait.Trait}"></TextBlock>
 									</DataTemplate>									
 								</ItemsRepeater.ItemTemplate>
-							</ItemsRepeater>
+							</ItemsRepeater>-->
 							<Button Command="{Binding $parent[UserControl].((vm:PageShowCatsVM)DataContext).DeleteCat}" CommandParameter="{Binding Id}">Удалить</Button>
 							<Button Command="{Binding $parent[UserControl].((vm:PageShowCatsVM)DataContext).UpdateCat}" CommandParameter="{Binding Id}">Редактировать</Button>
 						</StackPanel>