Articles in this section
Category / Section

How to change the filter predicate showing in CheckBoxFilter UI in WPF DataGrid (SfDataGrid)?

2 mins read

The items will be loaded inside the CheckBoxFilterControl based on the display text of FilterElement by default in GridFilterControl. You can also change the display text of CheckBoxFilterControl in FilterItemsPopulated event.

Due to performance reasons WPF DataGrid (SfDataGrid) creates filter predicates based on checked and unchecked items count (which count is less). However, you can change the filter predicate based on your display text in FilterChanging event.

Please refer the below code example for more details.

C#

this.dataGrid.Loaded += dataGrid_Loaded;
private void dataGrid_Loaded(object sender, RoutedEventArgs e)
{
    this.dataGrid.FilterItemsPopulated += dataGrid_FilterItemsPopulated;          
}
 
private static readonly List<string> FilterColumnsName = new List<string> { "ShipDate", "OrderDate" };
 
private void dataGrid_FilterItemsPopulated(object sender, GridFilterItemsPopulatedEventArgs e)
{          
    if (FilterColumnsName.Contains(e.Column.MappingName))
    {              
        e.FilterControl.OkButtonClick += FilterControl_OkButtonClick;
        var itemsSource = e.ItemsSource as List<FilterElement>;              
        foreach (var a in itemsSource)
        {
            var tmp = (DateTime)a.ActualValue;
            //you can change the DisplayText of FilterElement here.
            a.DisplayText = tmp.ToString("dd MMMM yyyy", CultureInfo.CurrentCulture);                 
        }              
    }
}
 
IEnumerable<FilterElement> checkedItems = null;
IEnumerable<FilterElement> unCheckedItems = null;
private void FilterControl_OkButtonClick(object sender, OkButtonClikEventArgs args)
{
    checkedItems = args.CheckedElements;
    unCheckedItems = args.UnCheckedElements;
    (sender as GridFilterControl).OkButtonClick -= FilterControl_OkButtonClick;
}
 
private void dataGrid_FilterChanging(object sender, GridFilterEventArgs e)
{
    if (!FilterColumnsName.Contains(e.Column.MappingName))
        return;           
    if (e.FilterPredicates == null)
        return;
    //Due to performance reasons in SfDataGrid FilterPredicates are created based on Checked and UnChecked items count (Which count is less)
    //so need to change the FilterPredicates after changing DisplayText of FilterElement.
    if (checkedItems.Count() > unCheckedItems.Count())
    {
        e.FilterPredicates.Clear();
        var init = true;
        foreach (var filterElement in checkedItems)
        {
            var c = new FilterPredicate();                    
            c.FilterValue = filterElement.ActualValue;
            c.FilterBehavior = FilterBehavior.StringTyped;
            c.FilterType = Syncfusion.Data.FilterType.Contains;
            c.PredicateType = init ? PredicateType.And : PredicateType.Or;
            init = false;
            e.FilterPredicates.Add(c);
        }
    }           
}  

View sample in GitHub.

 

 

 

Did you find this information helpful?
Yes
No
Help us improve this page
Please provide feedback or comments
Comments (0)
Please sign in to leave a comment
Access denied
Access denied