В WPF фильтрация для встроенных элементов управления выполняется с использованием CollectionView
. Этот CollectionView
затем присваивается как ItemsSource
элемента управления коллекцией (все, что получено из ItemsControl
).
Начиная с .NET 3.5 SP1, свойство фильтра в классе CollectionView
принимает делегата типа Predicate<object>
. Predicate<object>
, по-видимому, по сути совпадает с Func<object, bool>
, но они не совместимы напрямую. Вы сможете легко создать делегат Func<object, bool>
для переноса делегата Predicate<object>
.
public static Func<object, bool> GetFuncFromPred(Predicate<object> pred)
{
return (obj => pred.Invoke(obj));
}
Вы можете вызвать это на фильтрах в CollectionView
, а затем использовать их в запросе LINQ.
Пример:
List<object> list = GetList();
CollectionView colView = new CollectionView(list);
ListBox lb = GetListBox();
lb.ItemsSource = colView;
colView.Filter = GetFilter();
var filteredItems = list.Where(GetFuncFromPred(colView.Filter));