Фильтруйте CollectionViewSource и затем сортируйте вручную - PullRequest
1 голос
/ 12 марта 2019

У меня есть ObservableCollection<Recipe>, который связан с ICollectionView. Можно фильтровать по моей личной реализации предиката. ICollectionView связан с dataGrid.

Теперь я хотел бы изменить порядок списка Recipes после фильтрации коллекции.

Рецепт получил свойство «Идентификатор». Если вы ввели точно идентификатор рецепта, его следует поместить в начало списка.

Пример:

  • 12345
  • 1234
  • 123

Если вы введете 1234 в фильтр, Recipe с Identifier = 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;
}

1 Ответ

0 голосов
/ 12 марта 2019

Вы можете добавить свойство SortOrder к классу Recipe и новое SortDescription(nameof(Recipe.SortOrder), ListSortDirection.Ascending) к свойству SortDescriptions ICollectionView. Затем вы устанавливаете значение свойства SortOrder всех объектов Recipe в соответствии с желаемым порядком сортировки. Это должно изменить порядок списка рецептов.

В зависимости от ваших требований, вы можете использовать CollectionViewSource с включенной оперативной сортировкой: https://wpf.2000things.com/2014/01/16/988-enabling-live-sorting-in-a-collectionviewsource/

Как указал @redcurry, если вы используете ListCollectionView, существует свойство CustomSort, которое можно установить на IComparer.

...