0

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

ObservableCollection 是“Person”对象的集合。它公开了一个属性“使用计数”。

现在,如果“搜索字符串”为空,我必须显示 ObservableCollection 中的前 30 条记录。“Person”类中的“UsageCount”属性决定前30 条记录(即必须显示UsageCount 最大的前30 条记录)。UsageCount 属性动态变化。我如何做到这一点..请帮助。提前致谢 :)

4

2 回答 2

0

要处理您的可搜索排序集合,您可以构建自己的对象,从 ObverservableCollection 继承,重载 Item 默认属性,添加(通知)SearchString 属性,监听您的 Person 整个列表的更改,基于更改(更改 SeachString 或一个人的UsageCount)一个新的人的私人列表,并使用NotifyCollectionChanged事件来通知它。

于 2012-05-01T09:10:04.300 回答
0

这是一个想法,如果您需要过滤为什么不绑定到 ListCollectionView

in the View 

   ComboBox ItemsSource="{Binding PersonsView}" //instead of Persons

在您的视图模型中:

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
}
于 2012-05-03T22:39:03.773 回答