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;
        }
    }
}

ここで、並べ替えの説明を追加するとフィルターが削除される理由について説明します。

を に追加するSortDescriptionCollectionViewSource、舞台裏で最終的にこのコード ブロックにヒットします。

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 に答える