我创建了一个WPF自定义ComboBox,它能够根据“搜索字符串”过滤项目。 ComboBox ItemsSource绑定到ObservableCollection。
ObservableCollection是“Person”对象的集合。它公开了一个属性“Usage Count”。
现在,如果“搜索字符串”为空,我必须显示ObservableCollection中的前30条记录。 “Person”类中的“UsageCount”属性决定前30个记录(即必须显示具有最大UsageCount的前30个记录)。 UsageCount属性动态更改。 我如何实现这一目标.. 请帮忙。在此先感谢:)
答案 0 :(得分:0)
要处理可搜索的已排序集合,您可以构建自己的对象,继承自ObverservableCollection,重载Item默认属性,添加(通知)SearchString属性,监听Person整个列表的更改,构建基于更改(更改) SeachString或Person的UsageCount)一个新的私有人员列表,并使用NotifyCollectionChanged事件来通知它。
答案 1 :(得分: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);
在你看来的某个地方你显然有一个地方响应了组合框的变化,在那里你更新了过滤器,你可以在那里放置过滤器
_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
}