2009-04-20 3 views
1

Большинство элементов управления сетью данных WPF имеют встроенную возможность фильтрации отображаемых данных. Я заинтересован в использовании этой функции, но отключился от использования сетки данных.Автономный фильтр фильтра WPF

Я надеюсь найти пользовательский элемент управления, который вернет Expression<Func<T, bool>>, который я могу использовать в запросе LINQ. Кто-нибудь знает о таком пользовательском контроле?

ответ

5

В 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)); 
+0

Эй, спасибо, но я думаю, что ваш ответ немного отстает. Я ищу WPF-элемент управления для выражения. – NoizWaves

+0

Вы можете найти пользовательский, который кто-то создал, но нет встроенного в WPF-элемента управления, который делает это. Сожалею. Я объяснял, как вы могли бы сделать это сами, если бы захотели. –

0

Я не знаю ни одного. Мы должны были строить свои собственные.

Мы использовали CollectionViewSource и добавили фильтр по умолчанию, а также возможность замены по умолчанию настраиваемого фильтра.

+0

Bummer. Я думаю, что это может быть дорога. Могли ли вы создать элемент управления, который использовал Generics and Reflection, или создать жестко закодированные фильтры для каждого класса? – NoizWaves

+1

Мы использовали свойство публичной зависимости типа Predicat , а затем задали свойство фильтра на объекте CollectionViewSource, вызвав при необходимости обновление. –

0

вы можете попробовать это: http://dotnetexplorer.blog.com/2011/04/07/wpf-itemscontrol-generic-staticreal-time-filter-custom-control-presentation/

Это универсальный, динамичный, полный XAML декларативный ItemsControl управления пользовательского фильтра. Он может фильтровать datagrid, listbox, combobox и т. Д.

Компонент использует прекомпилированное выражение ссылки для определения и сравнения значений объектов, поэтому он предлагает довольно хорошие показатели.

Надеюсь, это поможет!

+0

И кроме того, вам не нужно писать какую-либо логику фильтрации, а не код C#, juste объявляет ваш ItemsControl в XAML, привязывает его к любой коллекции любых объектов, объявляет (в XAML) также тип коллекции и свойства на вы хотите, чтобы фильтр применялся, и здесь вы идете. Он также поддерживает режим переключения «И/ИЛИ», «!» операнд и может ссылаться на пользовательский строковый формат или конвертер, чтобы гарантировать, что значения объекта формируются для сравнения так же, как они находятся в пользовательском интерфейсе. – Bruno

Смежные вопросы