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
}
Другие вопросы по тегам