WPF: Как мне ограничить количество элементов в Combobox ItemsSource?
Я создал собственный ComboBox WPF, который имеет возможность фильтровать элементы в соответствии с "строкой поиска". Элемент ComboBox ItemsSource связан с коллекцией ObservableCollection.
ObservableCollection является коллекцией объекта "Person". Он выставляет свойство "Счетчик использования".
Теперь, если "строка поиска" пуста, я должен показать 30 лучших записей из ObservableCollection. Свойство "Usage Count" в классе "Person" определяет 30 лучших записей (т. Е. Должны отображаться 30 лучших записей с максимальным UsageCount). Свойство UsageCount изменяется динамически. Как мне этого добиться.. Пожалуйста, помогите. Заранее спасибо:)
2 ответа
Для обработки отсортированной коллекции с возможностью поиска вы можете создать свой собственный объект, унаследованный от ObverservableCollection, перегрузив свойство элемента по умолчанию, добавив (уведомляя) свойство SearchString, прослушивая изменения всего списка Person, опираясь на изменения (изменения в SeachString или в UsageCount of Person) новый личный список и использование события NotifyCollectionChanged для его уведомления.
Вот идея, если вам нужна фильтрация, почему бы не привязать к ListCollectionView
in the View
ComboBox ItemsSource="{Binding PersonsView}" //instead of Persons
в вашей ViewModel:
public ListCollectionView PersonsView
{
get { return _personsView; }
private set
{
_personsView= value;
_personsView.CommitNew();
RaisePropertyChanged(()=>PersonsView);
}
}
как только вы заполнили свой список
PersonsView= new ListCollectionView(_persons);
где-то, на ваш взгляд, у вас, очевидно, есть место, реагирующее на изменение комбобокса, где вы обновляете фильтр, вы можете поместить там фильтр применения
_viewModel.PersonsView.Filter = ApplyFilter;
где ApplyFilter - это действие, которое решает, что будет отображаться
//this will evaluate all items in the collection
private bool ApplyFilter(object item)
{
var person = item as Person;
if(person == null)
{
if(person is in that 30 top percent records)
return false; //don't filter them out
}
return true;
}
//or you can do some other logic to test that Condition that decides which Person is displayed, this is obviously a rough sample
}