using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Ageev_Exam_Tour.Model { internal class TourList : INotifyPropertyChanged // Подключил чтобы в реальном времени менять поля и дергать объекты { // Чтобы реагировать на некоторые изменение внутри свойств public event PropertyChangedEventHandler PropertyChanged; List defaultTour; int typeId; public int TypeId { get => typeId; set { typeId = value; PropertyChanged.Invoke(this, new PropertyChangedEventArgs(nameof(TypeId))); FiltersForPage(); } } // Массив для определения сортировки цены string[] priceSort = new string[] { "По умолчанию", "По возврастанию", "По убыванию" }; public string[] PriceSort { get => priceSort; set => priceSort = value; } int priceID; public int PriceId { get => priceID; set { priceID = value; PropertyChanged.Invoke(this, new PropertyChangedEventArgs(nameof(PriceId))); FiltersForPage(); } } decimal totalPrice; public decimal TotalPrice { get => totalPrice; set { totalPrice = value; PropertyChanged.Invoke(this, new PropertyChangedEventArgs(nameof(TotalPrice))); } } List types; // Чтобы хранить // Чтобы менять public List Types { get => types; set => types = value; } List currentTour; // Некоторое поле в которое мы оставляем лист // Свойство с помощью которого достаём поле выше, которое можно менять public List CurrentTour { get => currentTour; set { currentTour = value; TotalPrice = currentTour.Sum(ct => ct.Price * (decimal)ct.TicketCount ); PropertyChanged.Invoke(this, new PropertyChangedEventArgs(nameof(CurrentTour))); } } // Это нужно чтобы туда помещать что мы пишем string finderText = string.Empty; // Свойство которое дергает некоторый объект в XAML public string Finder { get => finderText; set{ finderText = value; PropertyChanged.Invoke(this, new PropertyChangedEventArgs(nameof(Finder))); FiltersForPage(); } } private bool _isActual = false; // Чтобы изначально правильно интерпретировал public bool IsActual { get => _isActual; set { if (_isActual == value) return; // Чтобы постоянно не дёргал _isActual = value; PropertyChanged.Invoke(this, new PropertyChangedEventArgs(nameof(_isActual))); FiltersForPage(); } } public TourList() // Конструктор { // Для туров defaultTour = GeneralData.myDataBase.Tour.ToList(); currentTour = defaultTour; // Для типов Types = GeneralData.myDataBase.Type.ToList(); Types.Insert(0, new Type { Name = "Все типы" }); typeId = 0; priceID = 0; totalPrice = 0; } void FiltersForPage() { List currentTour = GeneralData.myDataBase.Tour.ToList(); if( !(string.IsNullOrEmpty(finderText)) ) // Фильтр по названию currentTour = currentTour.Where( t => t.Name.ToLower().StartsWith( finderText.ToLower() ) ).ToList(); if (typeId != 0) // Фильтр по типу currentTour = currentTour.Where(ct => ct.Type.Contains(GeneralData.myDataBase.Type.FirstOrDefault(x => x.Id == typeId)) ).ToList(); if (_isActual) // Фильтр по актуальности currentTour = currentTour.Where( ct => ct.IsActual == _isActual).ToList(); if (priceID != 0) { if (priceID == 1) currentTour = currentTour.OrderBy( ct => ct.Price ).ToList(); if (priceID == 2) currentTour = currentTour.OrderByDescending( ct => ct.Price ).ToList(); } // Необходимо вызвать уже предопределённое свойство CurrentTour = currentTour; } } public partial class Tour { // Нужно чтобы сам парился с картинками public object ImageOnView { get { if (ImagePreview == null) return "..\\Res\\picture.png"; else return ImagePreview; } } // Нужно чтобы сам парился с актуальностью public object IsActualString { get { if (IsActual) return "Актуален"; else return "Не актуален"; } } } }