Фильтр WPF DataGrid

Я ищу пример или образец для фильтрации элементов столбца WPF DataGrid в текстовом поле.

alt text

Что-то похожее на this (в данном примере используется WPFToolkit... очевидно, оставленный Microsoft...)

ИЗМЕНИТЬ

Обновление кода

XAML

<Canvas>
    <DataGrid Height="200" Name="dataGrid1" Width="200" Canvas.Top="23" />
    <TextBox  Name="textBox1" Width="120" />
</Canvas>

CS:

public partial class MainWindow : Window
{
    private List<Personne> persons;
    ICollectionView cvPersonnes;

    public MainWindow()
    {
        InitializeComponent();

        persons = new List<Personne>();

        persons.Add(new Personne() { Id = 1, Nom = "Jean-Michel", Prenom = "BADANHAR" });
        persons.Add(new Personne() { Id = 1, Nom = "Gerard", Prenom = "DEPARDIEU" });
        persons.Add(new Personne() { Id = 1, Nom = "Garfild", Prenom = "THECAT" });
        persons.Add(new Personne() { Id = 1, Nom = "Jean-Paul", Prenom = "BELMONDO" });

        cvPersonnes = CollectionViewSource.GetDefaultView(persons);

        if (cvPersonnes != null)
        {
            dataGrid1.AutoGenerateColumns = true;
            dataGrid1.ItemsSource = cvPersonnes;
            cvPersonnes.Filter = TextFilter;
        }
    }

    public bool TextFilter(object o)
    {
        Personne p = (o as Personne);
        if (p == null) 
            return false;

        if (p.Nom.Contains(textBox1.Text))
            return true;
        else
            return false;
    }

}

public class Personne
{
    public int Id { get; set; }
    public string Nom { get; set; }
    public string Prenom { get; set; }
}

Ответ 1

Вы можете фильтровать элементы в DataGrid, привязывая его к ICollectionView, который поддерживает фильтрацию.

Подробнее здесь для .NET 4. Процесс тот же для .NET 4.5, но, похоже, документация была потеряна. Здесь мало упоминается здесь в заголовке "Группирование, сортировка и фильтрация".

edit: в то время, когда это было изначально написано, инструментарий WPF не был оставлен Microsoft. Элементы управления, которые раньше были частью этого, теперь находятся в рамках, и инструментарий был жив и хорошо работает здесь

Ответ 2

Я видел на разных сайтах много шума по этому поводу...

Чтобы отфильтровать последний, являющийся datagrid, используя источник данных, который является источником, который довольно часто используется для создания кода ниже:

DataTable dt = new DataTable("Table1");

//fill your datatable...

//after fill...
dataGrid1.DataContext = dt;
IBindingListView blv = dt.DefaultView;
blv.Filter = "NAME = 'MOISES'";

Ответ 3

Существует несколько решений, но, на мой взгляд, лучшие решения - это те, которые используют только стили DataGrid, не изобретая новый унаследованный тип DataGird. Ниже приведены лучшие результаты:

Ответ 4

Я написал свой собственный FilterDataGrid Control, он намного более гибкий, чем те, которые были предоставлены в CodeProject или в другом месте. Я не могу опубликовать полный код здесь, и не могу опубликовать его.

Но: поскольку ваш источник данных, скорее всего, завернут в ICollectionView, вы можете сделать что-то вроде этого:

    public void ApplyFilters()
    {
        ICollectionView view = CollectionViewSource.GetDefaultView(ItemsSource);
        if (view != null)
        {
            view.Filter = FilterPredicate; 
        }
    }

    private bool FilterPredicate(object item)
    {
        var yourBoundItemOrRow = item as BoundItemType;

        return aFilterObject.Matches(yourBoundItemOrRow);
    }

Вы можете легко реализовать любую логику фильтра, основанную на этой концепции. Даже очень, очень мощные фильтры. Примечание. У меня есть те методы в моем собственном классе, полученные из datagrid. Они также могут быть адаптированы для работы вне сетки, например, в UserControl