Фильтрация COMBOBOX в WPF с MVVM

Вопрос: Я разрабатываю приложение, используя подход WPF mvvm. У меня есть требование, когда я должен показать список элементов в поле со списком для выбора. На основе некоторого флага мне нужно отфильтровать несколько элементов из поля со списком для выбора. Я попытался использовать два разных источника источников: один с полным списком, другой - с фильтрованным списком,

Вопрос:

Я разрабатываю приложение, используя подход WPF mvvm. У меня есть требование, когда я должен показать список элементов в поле со списком для выбора. На основе некоторого флага мне нужно отфильтровать несколько элементов из поля со списком для выбора.

Я попытался использовать два разных источника источников: один с полным списком, другой – с фильтрованным списком, и на основе флага я хотел изменить источник элементов. Это, кажется, не работает хорошо. Есть ли простой способ применения фильтров в существующем списке на основе некоторого флага?

Лучший ответ:

Существует много разных способов сделать это, но мое личное предпочтение – использовать ListCollectionView в качестве ListCollectionView элемента управления, отображающего отфильтрованный список, установить предикат фильтра в ListCollectionView.Filter и вызвать ListCollectionView.Refresh когда параметры фильтра изменяются.

Пример ниже будет фильтровать список стран, основанных на их континенте.

Код

using System.Collections.ObjectModel; using System.ComponentModel; using System.Windows.Data; public class FilteringViewModel : INotifyPropertyChanged { private ObservableCollection<Country> _countries; private ContinentViewModel _selectedContinent; public ListCollectionView CountryView { get; set; } public event PropertyChangedEventHandler PropertyChanged; public ObservableCollection<ContinentViewModel> Continents { get; set; } public FilteringViewModel() { _countries = new ObservableCollection<Country>( new[] { new Country() { Continent = Continent.Africa, DisplayName = «Zimbabwe» }, new Country() { Continent = Continent.Africa, DisplayName = «Egypt» }, new Country() { Continent = Continent.Europe, DisplayName = «United Kingdom» } }); CountryView = new ListCollectionView(_countries); CountryView.Filter = o => _selectedContinent == null || ((Country)o).Continent == _selectedContinent.Model; Continents = new ObservableCollection<ContinentViewModel>(Enum.GetValues(typeof(Continent)).Cast<Continent>().Select(c => new ContinentViewModel { Model = c})); } public ContinentViewModel SelectedContinent { get { return _selectedContinent; } set { _selectedContinent = value; OnContinentChanged(); this.OnPropertyChanged(«SelectedContinent»); } } private void OnContinentChanged() { CountryView.Refresh(); } protected virtual void OnPropertyChanged(string propertyName) { PropertyChangedEventHandler handler = this.PropertyChanged; if (handler != null) { handler(this, new PropertyChangedEventArgs(propertyName)); } } } public class Country { public string DisplayName { get; set; } public Continent Continent { get; set; } } public enum Continent { [Description(«Africa»)] Africa, Asia, Europe, America } public class ContinentViewModel { public Continent Model { get; set; } public string DisplayName { get { return Enum.GetName(typeof(Continent), Model); } } }

XAML

<StackPanel Orientation=»Vertical»> <ComboBox ItemsSource=»{Binding Continents}» SelectedItem=»{Binding SelectedContinent}» DisplayMemberPath=»DisplayName» /> <ListBox ItemsSource=»{Binding CountryView}» DisplayMemberPath=»DisplayName» /> </StackPanel> Ответ №1

Есть ли простой способ применения фильтров в существующем списке на основе некоторого флага?

Хотя ваш вопрос непонятен, но я думаю, вам не нужно поддерживать два списка, чтобы получить данные фильтра. Вы можете использовать простой LINQ для фильтрации. Предположим, что у вас есть свойство ViewModel, например

public IEnumerable<ComboBoxItem> Data { get ; set ; }

И вы хотите отфильтровать это на основе некоторых значений bool, тогда вы можете написать что-то вроде

ViewModel.Data.ToList().Where(item => item.Status).ToList()

Статус может быть bool на основе того, что вы хотите отфильтровать свои данные, и вы можете добавить этот bool в свой класс ComboBoxItem.

Оцените статью
Добавить комментарий