DxFilterBuilder Class
A UI component that allows users to build complex filter criteria with various filter conditions combined by logical operators.
Namespace: DevExpress.Blazor
Assembly: DevExpress.Blazor.v25.1.dll
NuGet Package: DevExpress.Blazor
Declaration
public class DxFilterBuilder :
DxComponentBase,
IFilterBuilderFieldsOwner,
INestedSettingsOwner,
IDisposable
Remarks
The DevExpress Blazor Filter Builder (<DxFilterBuilder>
) allows users to create complex filter criteria. The component builds filter expressions using our DevExpress Criteria Operator language. You can use DxFilterBuilder
as a standalone component or connect it to any data-aware DevExpress Blazor control.
Important
The Filter Builder component is currently available as a community technology preview (CTP).

Add a Filter Builder to a Project
Follow the steps below to add a Filter Builder component to an application:
- Use a DevExpress Project Template to create a new Blazor Server or Blazor WebAssembly application. If you use a Microsoft project template or already have a Blazor project, configure your project to incorporate DevExpress Blazor components.
- Add the following markup to a
.razor
file:<DxFilterBuilder>
…</DxFilterBuilder>
. - Populate the component with fields using DxFilterBuilderField objects.
API Reference
Refer to the following list for the component API reference: DxFilterBuilder Members.
Static Render Mode Specifics
Blazor Filter Builder does not support static render mode. Enable interactivity to use the component in your application. Refer to the following topic for more details: Enable Interactive Render Mode.
Fields
Use the DxFilterBuilder.Fields property to specify a collection of root fields. A DxFilterBuilderField object implements an individual field.
Use DxFilterBuilderField.FieldName and DxFilterBuilderField.Type properties to supply fields with data and generate relevant editors based on data field types.
You can declare fields one by one in Razor markup:
<DxFilterBuilder>
<Fields>
<DxFilterBuilderField FieldName="Name" Caption="Subject" Type="typeof(string)" />
<DxFilterBuilderField FieldName="OwnerID" Caption="Assignee" Type="typeof(int)" />
<DxFilterBuilderField FieldName="CreatedDate" Caption="Created" Type="typeof(DateTime)" />
<DxFilterBuilderField FieldName="FixedDate" Caption="Fixed" Type="typeof(DateTime)" />
</Fields>
</DxFilterBuilder>
or iterate through model class properties and define fields in a loop:
<DxFilterBuilder>
<Fields>
@foreach(var field in typeof(Invoice).GetProperties()){
<DxFilterBuilderField FieldName="@field.Name" Type="@field.PropertyType" />
}
</Fields>
</DxFilterBuilder>
Hierarchical Fields
For complex data models, you can organize fields into a tree-like structure. Use DxFilterBuilderField.Fields properties to manage nested field collections.
<DxFilterBuilder>
<Fields>
@* ... *@
<DxFilterBuilderField FieldName="SupplierId"
Caption="Supplier"
Type="@typeof(int)">
<Fields>
<DxFilterBuilderField FieldName="Supplier.CompanyName"
Caption="Company Name"
Type="@typeof(string)" />
<DxFilterBuilderField FieldName="Supplier.ContactName"
Caption="Contact Name"
Type="@typeof(string)" />
</Fields>
</DxFilterBuilderField>
</Fields>
</DxFilterBuilder>

Field Captions
The Filter Builder component allows you to customize field captions to be displayed in the tree (DxFilterBuilderField.Caption) and in the resulting filter criteria (DxFilterBuilderField.CaptionFullPath):
<DxFilterBuilder>
<Fields>
@* ... *@
<DxFilterBuilderField FieldName="SupplierId" Caption="Supplier" Type="@typeof(int)">
<Fields>
<DxFilterBuilderField FieldName="Supplier.CompanyName"
Caption="Company Name"
CaptionFullPath="Supplier.Company Name"
Type="@typeof(string)" />
<DxFilterBuilderField FieldName="Supplier.ContactName"
Caption="Contact Name"
CaptionFullPath="Supplier.Contact Name"
Type="@typeof(string)" />
</Fields>
</DxFilterBuilderField>
</Fields>
</DxFilterBuilder>

Customize Value Editors
Blazor Filter Builder generates and configures value editors for individual fields based on associated data types. You can declare an object that contains editor settings in the DxFilterBuilderField.EditSettings property to customize the default editor or replace it with another editor.
The following code snippet applies a mask to the Total currency field and configures a ComboBox for the Status enum field:
<DxFilterBuilder>
<Fields>
<DxFilterBuilderField FieldName="Total" Type="typeof(decimal)">
<EditSettings>
<DxSpinEditSettings Mask="c0" DisplayFormat="c0" />
</EditSettings>
</DxFilterBuilderField>
<DxFilterBuilderField FieldName="Status" Type="typeof(string)">
<EditSettings>
<DxComboBoxSettings Data="StatusList" />
</EditSettings>
</DxFilterBuilderField>
</Fields>
</DxFilterBuilder>
@code {
IEnumerable<string> StatusList = new List<string>() {
"New",
"Postponed",
"Fixed",
"Rejected"
};
}

Configure a Lookup Editor for a Foreign Key
For foreign key fields, you can display user-friendly text instead of ID values. To display user-friendly text, place a DxComboBoxSettings object in a field’s EditSettings tag and specify the editor data source, value field name, and text field name.
The following code snippet uses DxComboBoxSettings to customize display values for the Supplier field:
<DxFilterBuilder>
<Fields>
<DxFilterBuilderField FieldName="SupplierId"
Caption="Supplier"
Type="@typeof(int)">
<EditSettings>
<DxComboBoxSettings Data="Suppliers"
ValueFieldName="SupplierId"
TextFieldName="CompanyName">
</DxComboBoxSettings>
</EditSettings>
<Fields>
<DxFilterBuilderField FieldName="Supplier.CompanyName"
Caption="Company Name"
CaptionFullPath="Supplier.Company Name"
Type="@typeof(string)" />
<DxFilterBuilderField FieldName="Supplier.ContactName"
Caption="Contact Name"
CaptionFullPath="Supplier.Contact Name"
Type="@typeof(string)" />
</Fields>
</DxFilterBuilderField>
</Fields>
</DxFilterBuilder>

Connect The Filter Builder to a Data-Aware Component
You can connect the Blazor Filter Builder to data-aware DevExpress Blazor UI components that support CriteriaOperator syntax:
- DxGrid
- A component that displays data in a tabular format and allows users to edit, sort, group, filter, and otherwise shape data.
- DxTreeList
- A component that displays hierarchical data in a tabular format and allows users to edit, sort, filter, and otherwise shape data.
- DxPivotTable
- A Pivot Table component for multi-dimensional data analysis and cross-tab reporting.
- DxListBox<TData, TValue>
- A component that can connect to a data source and display a list of selectable items.
For two-way filter synchronization, use the @bind attribute for the DxFilterBuilder.FilterCriteria property:
<DxFilterBuilder @bind-FilterCriteria="FilterCriteria">
<Fields>
<DxFilterBuilderField FieldName="ProductName" Caption="Product Name" Type="@typeof(string)" />
<DxFilterBuilderField FieldName="CategoryId" Caption="Category" Type="@typeof(int)">
<EditSettings>
<DxComboBoxSettings Data="Categories" ValueFieldName="CategoryId" TextFieldName="CategoryName" />
</EditSettings>
</DxFilterBuilderField>
<DxFilterBuilderField FieldName="SupplierId" Caption="Supplier" Type="@typeof(int)">
<EditSettings>
<DxComboBoxSettings Data="Suppliers" ValueFieldName="SupplierId" TextFieldName="CompanyName">
<ItemDisplayTemplate>
@{
var item = (Supplier)context.DataItem;
}
@item.CompanyName (@item.ContactName)
</ItemDisplayTemplate>
</DxComboBoxSettings>
</EditSettings>
<Fields>
<DxFilterBuilderField FieldName="Supplier.CompanyName" Caption="Company Name" CaptionFullPath="Supplier.Company Name" Type="@typeof(string)" />
<DxFilterBuilderField FieldName="Supplier.ContactName" Caption="Contact Name" CaptionFullPath="Supplier.Contact Name" Type="@typeof(string)" />
</Fields>
</DxFilterBuilderField>
<DxFilterBuilderField FieldName="UnitPrice" Caption="Unit Price" Type="@typeof(int)" />
<DxFilterBuilderField FieldName="UnitsInStock" Caption="Units in Stock" Type="@typeof(int)" />
<DxFilterBuilderField FieldName="QuantityPerUnit" Caption="Quantity per Unit" Type="@typeof(int)" />
<DxFilterBuilderField FieldName="Discontinued" Type="@typeof(bool)" />
</Fields>
</DxFilterBuilder>
<div>
<DxButton Text="Clear" Click="ClearFilterCriteria" RenderStyle="ButtonRenderStyle.Secondary"/>
<DxButton Text="Apply" Click="ApplyFilterCriteria" />
</div>
<DxGrid @ref="Grid" Data="Data"
PageSize="15"
ColumnResizeMode="GridColumnResizeMode.NextColumn"
TextWrapEnabled="false" VirtualScrollingEnabled="true"
FilterCriteriaChanged="GridFilterCriteriaChanged"
FilterMenuButtonDisplayMode="GridFilterMenuButtonDisplayMode.Always">
<Columns>
<DxGridDataColumn FieldName="ProductName" MinWidth="100" />
<DxGridDataColumn FieldName="Category.CategoryName" Caption="Category" MinWidth="100" />
<DxGridDataColumn FieldName="Supplier.CompanyName" Caption="Company Name" MinWidth="100" />
<DxGridDataColumn FieldName="Supplier.ContactName" Caption="Contact Name" MinWidth="100" />
<DxGridDataColumn FieldName="UnitPrice" DisplayFormat="c" Width="10%" />
<DxGridDataColumn FieldName="UnitsInStock" Caption="Units in Stock" Width="10%" />
<DxGridDataColumn FieldName="QuantityPerUnit" Caption="Quantity per Unit" Width="15%" MinWidth="80" />
<DxGridDataColumn FieldName="Discontinued" Width="10%" MinWidth="90" />
</Columns>
</DxGrid>
@code {
IGrid Grid { get; set; }
object Data { get; set; }
CriteriaOperator FilterCriteria { get; set; } = CriteriaOperator.Parse("StartsWith([ProductName], 'C') And ([UnitPrice] < 50 Or [Discontinued] = true)");
IEnumerable<Product> Products { get; set; }
IEnumerable<Category> Categories { get; set; }
IEnumerable<Supplier> Suppliers { get; set; }
List<Category> SelectedCategories { get; set; } = [];
protected override async Task OnInitializedAsync() {
Suppliers = await NwindDataService.GetSuppliersAsync();
Categories = await NwindDataService.GetCategoriesAsync();
Products = await NwindDataService.GetProductsAsync();
// ...
}
protected override void OnAfterRender(bool firstRender) {
base.OnAfterRender(false);
if (firstRender && Grid != null)
ApplyFilterCriteria();
}
void ApplyFilterCriteria() {
Grid.SetFilterCriteria(FilterCriteria);
}
void ClearFilterCriteria() {
FilterCriteria = null;
Grid.ClearFilter();
}
void GridFilterCriteriaChanged(GridFilterCriteriaChangedEventArgs args) {
FilterCriteria = args.FilterCriteria;
}
}
Troubleshooting
If a Blazor application throws unexpected exceptions, refer to the following help topic: Troubleshooting.