筛选一个 CollectionViewSource 然后手动排序

Filter a CollectionViewSource and then sort manually

我有一个 ObservableCollection<Recipe> 绑定到 ICollectionView。可以通过我个人的谓词实现进行过滤。 ICollectionView 绑定在 dataGrid.

现在我想在集合过滤后重新排序 Recipes 的列表。

一个菜谱得到了 属性 'Identifier'。如果您输入了准确的食谱标识符,它应该放在列表的顶部。

一个例子:

如果您在过滤器中键入 1234RecipeIdentifier = 1234 应该放在列表的顶部,而不是排在第二位。

public ICollectionView RecipeCollection
{
    get => _RecipeCollection;
    set
    {
        _RecipeCollection = value;
        OnPropertyChanged();
    }
}
private ICollectionView _RecipeCollection;


Recipes = new ObservableCollection<Recipe>(databaseQuery.Result);
RecipeCollection = CollectionViewSource.GetDefaultView(Recipes);
RecipeCollection.Filter = CollectionViewSource_Filter;



private bool CollectionViewSource_Filter(object item)
{
    if (item is Recipe recipe)
    {
        if (string.IsNullOrEmpty(SearchBox.Text))
        {
            return true;
        }

        string filter = SearchBox.Text.ToLower();
        if (recipe.Identifier.ToLower().Contains(filter))
        {
            return true;
        }

        if (!string.IsNullOrEmpty(recipe.Name) && recipe.Name.ToLower().Contains(filter))
        {
            return true;
        }

        if (!string.IsNullOrEmpty(recipe.Description) && recipe.Description.ToLower().Contains(filter))
        {
            return true;
        }
    }

    return false;
}

您可以将 SortOrder 属性 添加到 Recipe class 并将新的 SortDescription(nameof(Recipe.SortOrder), ListSortDirection.Ascending) 添加到 SortDescriptions 属性 的 ICollectionView。然后根据您想要的排序顺序设置所有 Recipe 对象的 SortOrder 属性 的值。这应该重新排序食谱列表。

根据您的要求,您可能希望使用启用实时排序的 CollectionViewSourcehttps://wpf.2000things.com/2014/01/16/988-enabling-live-sorting-in-a-collectionviewsource/

正如@redcurry 所指出的,如果您使用 ListCollectionView,则可以将 CustomSort 属性 设置为 IComparer.