Search code examples
c#wpfdatagridfilter

Filter a DataGrid in WPF


I load a lists of objects in a datagrid with this:

dataGrid1.Items.Add(model);

The model become data from a database. It has a Id(int), Name(string) and Text(string)

In my datagrid I show only the Name of the model. How can I filter the datagrid now, when I enter something in a textbox?

I was at this page: http://msdn.microsoft.com/en-us/library/vstudio/ff407126(v=vs.100).aspx but I don't understand the code from there and I can not explain how I should transpose that for my problem.


Solution

  • there are multiple way's to filter Collection

    let's suggesting this is your Item Class

    public class Model
    {
        public string Name
        {
            get;
            set;
        }
    }
    

    and your collection looks like

           var ObColl = new ObservableCollection<Model>();
    
            ObColl.Add(new Model() { Name = "John" });
            ObColl.Add(new Model() { Name = "Karl" });
            ObColl.Add(new Model() { Name = "Max" });
            ObColl.Add(new Model() { Name = "Mary" });
    

    Way 1 (Predicate):

        public MainWindow()
        {
            InitializeComponent();
    
            // Collection which will take your ObservableCollection
            var _itemSourceList = new CollectionViewSource() { Source = ObColl };
    
            // ICollectionView the View/UI part 
            ICollectionView Itemlist = _itemSourceList.View;
    
            // your Filter
            var yourCostumFilter= new Predicate<object>(item => ((Model)item).Name.Contains("Max"));
    
            //now we add our Filter
            Itemlist.Filter = yourCostumFilter;
    
            dataGrid1.ItemsSource = Itemlist;
        }
    

    Way 2 (FilterEventHandler):

        public MainWindow()
        {
            InitializeComponent();
    
            // Collection which will take your Filter
            var _itemSourceList = new CollectionViewSource() { Source = ObColl };
    
           //now we add our Filter
           _itemSourceList.Filter += new FilterEventHandler(yourFilter);
    
            // ICollectionView the View/UI part 
            ICollectionView Itemlist = _itemSourceList.View;
    
            dataGrid1.ItemsSource = Itemlist;
        }
    
        private void yourFilter(object sender, FilterEventArgs e)
        {
            var obj = e.Item as Model;
            if (obj != null)
            {
                if (obj.Name.Contains("Max"))
                    e.Accepted = true;
                else
                    e.Accepted = false;
            }
        }
    

    extended Information to Way 1

    if need multiple conditions or some complex Filter you can add a method to your Predicat

        // your Filter
        var yourComplexFilter= new Predicate<object>(ComplexFilter);
    
        private bool ComplexFilter(object obj)
        {
            //your logic
        }