1

我定义了一个CollectionViewSource这样的,但似乎过滤器不起作用。

CollectionViewSource cvs = new CollectionViewSource();

//oc IS AN OBSERVABLE COLLECTION WITH SOME ITEMS OF TYPE MyClass
cvs.Source = oc;           

//IsSelected IS A bool? PROPERTY OF THE MyClass
cvs.View.Filter = new Predicate<object>(input=>(input as MyClass).IsSelected == true);

//Major IS AN string PROPERTY OF THE MyClass
cvs.SortDescriptions.Add(new SortDescription(
                           "Major", ListSortDirection.Ascending));

但是我以这种方式更改了代码,一切都解决了!

CollectionViewSource cvs = new CollectionViewSource();
cvs.Source = oc;           

cvs.SortDescriptions.Add(new SortDescription(
                           "Major", ListSortDirection.Ascending));

cvs.View.Filter = new Predicate<object>(input=>(input as MyClass).IsSelected == true);

有人知道方法吗?

4

1 回答 1

3

你应该问自己的第一件事是......

为什么我要将排序描述添加到 CollectionViewSource 并将筛选器添加到视图?我不应该将它们都添加到同一个对象中吗?

答案是肯定的!

CollectionViewSource直接添加过滤器逻辑,请为事件添加事件处理程序Filter

直接来自MSDN,这是一个示例

listingDataView.Filter += new FilterEventHandler(ShowOnlyBargainsFilter);
private void ShowOnlyBargainsFilter(object sender, FilterEventArgs e)
{
    AuctionItem product = e.Item as AuctionItem;
    if (product != null)
    {
        // Filter out products with price 25 or above 
        if (product.CurrentPrice < 25)
        {
            e.Accepted = true;
        }
        else
        {
            e.Accepted = false;
        }
    }
}

现在,至于为什么添加排序描述时过滤器会被删除。

当您将 a 添加SortDescription到 aCollectionViewSource时,它最终会在幕后命中此代码块。

Predicate<object> filter;
if (FilterHandlersField.GetValue(this) != null)
{
    filter = FilterWrapper;
}
else
{
    filter = null;
}

if (view.CanFilter)
{
    view.Filter = filter;
}

显然,它正在覆盖您在视图上设置的过滤器。

如果您仍然好奇,这里是CollectionViewSource 的源代码

于 2013-03-27T18:49:02.463 回答