WPF:如何限制Combobox ItemsSource中的项目数?

时间:2012-05-01 07:51:21

标签: wpf c#-4.0 collectionviewsource

我创建了一个WPF自定义ComboBox,它能够根据“搜索字符串”过滤项目。 ComboBox ItemsSource绑定到ObservableCollection。

ObservableCollection是“Person”对象的集合。它公开了一个属性“Usage Count”。

现在,如果“搜索字符串”为空,我必须显示ObservableCollection中的前30条记录。 “Person”类中的“UsageCount”属性决定前30个记录(即必须显示具有最大UsageCount的前30个记录)。 UsageCount属性动态更改。 我如何实现这一目标.. 请帮忙。在此先感谢:)

2 个答案:

答案 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
}