New to Telerik UI for WPF? Download free 30-day trial

Unbound Mode

There are scenarios, in which you might want to use RadDataFilter only for its UI without passing any data to it. This scenarios will require you to use the RadDataFilter's Unbound Mode feature. The usage of this feature consists in manually setting some of the RadDataFilter's properties and handling events.

The example in this topic will show you a RadGridView bound to a list of Employee objects. A RadDataFilter will be used as UI to filter the data, but the filtering itself will be done outside the RadDataFilter via manipulation of FilterDescriptor objects.

Here is the XAML for the example. In it you can see a RadGridView and a RadDataFilter.

<Grid x:Name="LayoutRoot" 
        Background="White"> 
    <Grid.RowDefinitions> 
        <RowDefinition Height="Auto" /> 
        <RowDefinition /> 
    </Grid.RowDefinitions> 
    <telerik:RadDataFilter x:Name="radDataFilter" /> 
    <telerik:RadGridView x:Name="radGridView" 
                            ItemsSource="{Binding FilteredSource, ElementName=radDataFilter}" 
                            AutoGenerateColumns="False" 
                            Grid.Row="1"> 
        <telerik:RadGridView.Columns> 
            <telerik:GridViewDataColumn DataMemberBinding="{Binding Name}" /> 
            <telerik:GridViewDataColumn DataMemberBinding="{Binding CompanyName}" /> 
            <telerik:GridViewDataColumn DataMemberBinding="{Binding Title}" /> 
        </telerik:RadGridView.Columns> 
    </telerik:RadGridView> 
</Grid> 

When in Unbound Mode, RadDataFilter has no Source. The developer instructs it what properties to show in its drop-downs by assigning its ItemPropertyDefinitions property. This is a collection of ItemPropertyDefinition objects that contains all the information regarding the properties, their type, their attributes, etc.

Here is the code-behind for the example. In it you should take notice at the instantiation of the ItemPropertyDefinition class and the objects passed to its constructor as arguments. Also take a closer look at the code inside the event handler for the FilterDescriptors collection's CollectionChanged event. In it is implemented the actual filtering. This is done by synchronizing the FilterDescriptors collection of the RadDataFilter with the one of the RadDataGridView.

At the end of the topic you can find the code for the Employee class, used in the example.

    public UnboundModeSample() 
    { 
        InitializeComponent(); 
        ItemPropertyDefinition nameDefinition = new ItemPropertyDefinition( "Name", typeof( string ), "Employee's Name" ); 
        this.radDataFilter.ItemPropertyDefinitions.Add( nameDefinition ); 
        this.radDataFilter.FilterDescriptors.CollectionChanged += this.FilterDescriptors_CollectionChanged; 
        this.radGridView.ItemsSource = RadGridViewSampleData.GetEmployees(); 
    } 
    private void FilterDescriptors_CollectionChanged( object sender, NotifyCollectionChangedEventArgs e ) 
    { 
        if ( e.Action == NotifyCollectionChangedAction.Add ) 
        { 
            this.radGridView.FilterDescriptors.AddRange( e.NewItems.OfType<IFilterDescriptor>() ); 
        } 
        else if ( e.Action == NotifyCollectionChangedAction.Remove ) 
        { 
            foreach ( var item in e.OldItems.OfType<IFilterDescriptor>() ) 
            { 
                this.radGridView.FilterDescriptors.Remove( item ); 
            } 
        } 
    } 
    Public Sub New() 
        InitializeComponent() 
        Dim nameDefinition As New ItemPropertyDefinition("Name", GetType(String), "Employee's Name") 
        Me.radDataFilter.ItemPropertyDefinitions.Add(nameDefinition) 
        AddHandler Me.radDataFilter.FilterDescriptors.CollectionChanged, AddressOf FilterDescriptors_CollectionChanged 
        Me.radGridView.ItemsSource = RadGridViewSampleData.GetEmployees() 
    End Sub 
    Private Sub FilterDescriptors_CollectionChanged(ByVal sender As Object, ByVal e As NotifyCollectionChangedEventArgs) 
        If e.Action = NotifyCollectionChangedAction.Add Then 
            Me.radGridView.FilterDescriptors.AddRange(e.NewItems.OfType(Of IFilterDescriptor)()) 
        ElseIf e.Action = NotifyCollectionChangedAction.Remove Then 
            For Each item In e.OldItems.OfType(Of IFilterDescriptor)() 
                Me.radGridView.FilterDescriptors.Remove(item) 
            Next item 
        End If 
    End Sub 

Here is also the code for the Employee class, used in the example.

public class Employee 
{ 
    public Employee( string name, string companyName, string title ) 
    { 
        this.Name = name; 
        this.CompanyName = companyName; 
        this.Title = title; 
    } 
    public string Name 
    { 
        get; 
        set; 
    } 
    public string CompanyName 
    { 
        get; 
        set; 
    } 
    public string Title 
    { 
        get; 
        set; 
    } 
} 
Public Class Employee 
    Public Sub New(name As String, companyName As String, title As String) 
        Me.Name = name 
        Me.CompanyName = companyName 
        Me.Title = title 
    End Sub 
    Public Property Name() As String 
        Get 
            Return m_Name 
        End Get 
        Set(value As String) 
            m_Name = Value 
        End Set 
    End Property 
    Private m_Name As String 
    Public Property CompanyName() As String 
        Get 
            Return m_CompanyName 
        End Get 
        Set(value As String) 
            m_CompanyName = Value 
        End Set 
    End Property 
    Private m_CompanyName As String 
    Public Property Title() As String 
        Get 
            Return m_Title 
        End Get 
        Set(value As String) 
            m_Title = Value 
        End Set 
    End Property 
    Private m_Title As String 
End Class 

See Also

In this article