using ApplicationAvalonia.Models; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using DryIoc.ImTools; using Microsoft.EntityFrameworkCore; using MsBox.Avalonia.Enums; using MsBox.Avalonia; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Text; using System.Threading.Tasks; using MsBox.Avalonia.ViewModels.Commands; using System.ComponentModel; using OpenGL; using Pango; namespace ApplicationAvalonia.ViewModels { internal partial class HomeViewModel : ViewModelBase, INotifyPropertyChanged { PageSwitcher pgSwitch; [ObservableProperty] List _listFilms; [ObservableProperty] List _listStorage; [ObservableProperty] List genres; [ObservableProperty] string _textSearch = string.Empty; static List valuesOfGenre = new List(); partial void OnTextSearchChanged(string value) { AllFilters(); } public HomeViewModel(ref PageSwitcher pgSwitch) { this.pgSwitch = pgSwitch; ListFilms = dbContext.Films.Include(x => x.FilmAndGenres).ThenInclude(x => x.Genre).Include(x => x.DirectorsAndFilms) .ThenInclude(x => x.IdDirectorNavigation).ToList(); Genres = dbContext.Genres.ToList(); ListStorage = ListFilms; } private void AllFilters() { ListFilms = ListStorage; if (valuesOfGenre.Count() > 0) { var filmsAndGenre = dbContext.FilmAndGenres.ToList(); // беру таблицу фильмов и жанров List idOfFilms = new List(); // создаю список под все перечисленные фильмы foreach (var genre in valuesOfGenre) // шагаю по всем жанрам и беру фильмы по ним (без повторов) { var items = filmsAndGenre.Where(x => x.GenreId == genre).Select(x => x.FilmId).ToList(); var unique = items.Except(idOfFilms); idOfFilms.AddRange(unique); } var newListFilms = new List(); // создаю объекты фильмов foreach (var film in idOfFilms) // добавляю каждый фильм из ранее найденных { var currentFilm = ListStorage.Find(x => x.Id == film); if (currentFilm != null) { newListFilms.Add(currentFilm); } } ListFilms = newListFilms; // отображаю на страницу } if (TextSearch.Trim() != string.Empty) { ListFilms = ListFilms.Where(x => x.Name.ToLower().Contains(TextSearch.ToLower())).ToList(); } } [RelayCommand] private async void FilmInfo(int IdFilm) { var currentFilm = ListFilms.Find(x => x.Id == IdFilm); if (currentFilm != null) { valuesOfGenre = new List(); this.pgSwitch.View = new InfoFilmViewModel(ref pgSwitch, currentFilm); return; } var box = MessageBoxManager.GetMessageBoxStandard("Сообщение", "Что то пошло не так", ButtonEnum.Ok, Icon.Error); var result = await box.ShowAsync(); } [RelayCommand] private void CallCategory() { AllFilters(); } public static void TakeCategory(int IdCategory) { // Тут приходят команды из юзер контроль но в целом это костыль на check`ах // Лучше поставить на CallCategory с ID в аргументе if (!valuesOfGenre.Contains(IdCategory)) { valuesOfGenre.Add(IdCategory); } else { valuesOfGenre.Remove(IdCategory); } } [RelayCommand] private void GoToPersonalCabinet() { this.pgSwitch.View = new PersonalCabinetViewModel(ref pgSwitch); } } }