筛选一个 CollectionViewSource 然后手动排序
Filter a CollectionViewSource and then sort manually
我有一个 ObservableCollection<Recipe>
绑定到 ICollectionView
。可以通过我个人的谓词实现进行过滤。 ICollectionView
绑定在 dataGrid
.
现在我想在集合过滤后重新排序 Recipes
的列表。
一个菜谱得到了 属性 'Identifier'。如果您输入了准确的食谱标识符,它应该放在列表的顶部。
一个例子:
- 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;
}
您可以将 SortOrder
属性 添加到 Recipe
class 并将新的 SortDescription(nameof(Recipe.SortOrder), ListSortDirection.Ascending)
添加到 SortDescriptions
属性 的 ICollectionView
。然后根据您想要的排序顺序设置所有 Recipe
对象的 SortOrder
属性 的值。这应该重新排序食谱列表。
根据您的要求,您可能希望使用启用实时排序的 CollectionViewSource
:https://wpf.2000things.com/2014/01/16/988-enabling-live-sorting-in-a-collectionviewsource/
正如@redcurry 所指出的,如果您使用 ListCollectionView
,则可以将 CustomSort
属性 设置为 IComparer
.
我有一个 ObservableCollection<Recipe>
绑定到 ICollectionView
。可以通过我个人的谓词实现进行过滤。 ICollectionView
绑定在 dataGrid
.
现在我想在集合过滤后重新排序 Recipes
的列表。
一个菜谱得到了 属性 'Identifier'。如果您输入了准确的食谱标识符,它应该放在列表的顶部。
一个例子:
- 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;
}
您可以将 SortOrder
属性 添加到 Recipe
class 并将新的 SortDescription(nameof(Recipe.SortOrder), ListSortDirection.Ascending)
添加到 SortDescriptions
属性 的 ICollectionView
。然后根据您想要的排序顺序设置所有 Recipe
对象的 SortOrder
属性 的值。这应该重新排序食谱列表。
根据您的要求,您可能希望使用启用实时排序的 CollectionViewSource
:https://wpf.2000things.com/2014/01/16/988-enabling-live-sorting-in-a-collectionviewsource/
正如@redcurry 所指出的,如果您使用 ListCollectionView
,则可以将 CustomSort
属性 设置为 IComparer
.