@HVRS

Фильтрация данных для CollectionView в .NET MAUI MVVM?

Здравствуйте, суть такова: делаю фильтрацию CollectionView, который получает данные из ObservableCollection. Логика располагается во VIewModel классе. Данные для ObservableCollection получаю из HTTP запроса, после чего присваиваю полученные данные полю Products, к которому и обращается CollectionView.
public ObservableCollection<Product> Prodyct = httpClient.GetFromJsonAsync<ObservableCollection<Product>>("http://10.0.2.2:5192/api/Product").Result;


public  ObservableCollection<Product> Products
{
    get
    {
        var temp = Prodyct;

        return temp;
    }
    set          
    {
        if (Products != value)
        {
            Products = value;
            OnPropertyChanged();
        }
    }
}

Реализовал также полурабочий(одноразовый) поиск по тексту, на основе которого также сделал и тестовую фильтрацию:
private void OnChanged(object obj)
{
    List<Product> TempFiltered;
    
    TempFiltered = Prodyct.Where(contact => contact.Title.Contains(obj.ToString(), StringComparison.OrdinalIgnoreCase)).ToList();

    foreach (var item in Prodyct.ToList())
    {
        if (!TempFiltered.Contains(item))
        {
            Products.Remove(item);
        }
        else
        {
            if (!Products.Contains(item))
            {
                Products.Add(item);
            }
        }
    }
    OnPropertyChanged();
}

Особенностью реализации фильтрации является то, что сначала происходит вызов BottomSheet, который также привязан к этой же ViewModel(мне показалось, что так будет более удобно), после чего в этом окне происходит выбор параметра по которому необходимо отфильтровать коллекцию(название производителя) и при нажатии кнопки вызывается команда, работающая также как и метод поиска по тексту, представленный выше. Но если поиск хоть и работает один раз, но все же работает, то фильтрация отказывается обновлять коллекцию, т.е. все работает: из Products элементы удаляются, но CollectionView не обновляется совсем.
private void Filtration(object obj)//Объект получается из XAML BottomSheet'a
{
    List<Product> TempFiltered;
    var searchM = obj as Manufacturer;
    TempFiltered = Prodyct.Where(c => c.manufacturer.Contains(searchM.Title, StringComparison.OrdinalIgnoreCase)).ToList();
    foreach (var item in Prodyct.ToList())
    {
        if (!TempFiltered.Contains(item))
        {
            Products.Remove(item);
        }
        else
        {
            if (!Products.Contains(item))
            {
                Products.Add(item);
            }
        }
    }
    OnPropertyChanged();
}

С паттерном MVVM работаю впервые, поэтому не уверен в правильности объявления полей, а также поиска и фильтрации:) Буду очень благодарен, если подскажите как починить/сделать правильно поиск и фильтрацию.
  • Вопрос задан
  • 129 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы