2012-05-01 4 views
0

Я создал пользовательский ComboBox WPF, который имеет возможность фильтровать элементы в соответствии с «строкой поиска». Элемент ComboBox ItemsSource привязан к ObservableCollection.WPF: Как ограничить количество элементов в Combobox ItemsSource?

ObservableCollection - это коллекция объектов «Человек». Он предоставляет свойство «Usage Count».

Теперь, если «строка поиска» пуста, я должен показать 30 верхних записей из ObservableCollection. Свойство «UsageCount» в классе «Человек» решает записи Top 30 (т. Е. Должны отображаться верхние 30 записей с максимальным значением UsageCount). Свойство UsageCount изменяется динамически. Как это достичь. Пожалуйста, помогите. Заранее спасибо :)

ответ

0

Чтобы обработать свою сортированную коллекцию, доступную для поиска, вы можете создать свой собственный объект, наследующий от ObverservableCollection, перегружая свойство по умолчанию по умолчанию, добавляя (уведомляющее) свойство SearchString, прислушиваясь к изменениям вашего полного списка Person, (изменение в SeachString или в UsageCount of Person) нового частного человека и использование события NotifyCollectionChanged для уведомления.

0

вот идея, если вам нужна фильтрация, почему не связываться с 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); 

где-то в ваш взгляд у вас, очевидно, есть место, отвечающее на изменение combobox, где вы обновляете фильтр, Вы можете поместить применить фильтр там

_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 
} 
Смежные вопросы