Click here to Skip to main content
15,896,118 members
Articles / Desktop Programming / WPF

Automatic WPF Toolkit DataGrid Filtering

Rate me:
Please Sign up or sign in to vote.
4.91/5 (109 votes)
21 May 2010BSD6 min read 1.4M   23.5K   167  
This article discusses a component that enables automated content filtering for the WPF Toolkit DataGrid.
<Window x:Class="DataGridFilterTest.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

    xmlns:wpftoolkit="http://schemas.microsoft.com/wpf/2008/toolkit"
        
    xmlns:filter="clr-namespace:DataGridFilterLibrary;assembly=DataGridFilterLibrary"
    xmlns:local="clr-namespace:DataGridFilterTest;assembly=DataGridFilterTest"     
        
    
    Title="DataGridFilterLibrary Test Application" Name="MainWindow">
    
    <Grid>
        
        <Grid.Resources>
            <BooleanToVisibilityConverter x:Key="BooleanToVisibility"/>
        </Grid.Resources>
        
        <TabControl Name="myTab">
            
            <TabItem Header="Tab 1 - AutoGenerateColumns=False">
                
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="*" />
                        <RowDefinition Height="25" />
                    </Grid.RowDefinitions>
                    
                    <wpftoolkit:DataGrid 
                        
                       ColumnHeaderStyle="{StaticResource {ComponentResourceKey 
		                       TypeInTargetAssembly={x:Type filter:DataGridHeaderFilterControl}, 
		                       ResourceId=DataGridHeaderFilterControlStyle}}"
                        
                        AutoGenerateColumns="False"
                        ItemsSource="{Binding Path=EmployeeList}" 
                        Name="myGrid1" 
                        Grid.Row="0">

                            <wpftoolkit:DataGrid.Columns>
                                
                                <wpftoolkit:DataGridTextColumn Header="Id" Binding="{Binding Path=Id}"/>
                                <wpftoolkit:DataGridTextColumn Header="Name" Binding="{Binding Path=Name}"/>
                                <wpftoolkit:DataGridTextColumn Header="Email" Binding="{Binding Path=Email}"/>
                                <wpftoolkit:DataGridTextColumn Header="Address" Binding="{Binding Path=Address}"/>
                                <wpftoolkit:DataGridTextColumn Header="Employee Guid" Binding="{Binding Path=EmployeeGuid}"/>
                                <wpftoolkit:DataGridTextColumn Header="Work Experience" Binding="{Binding Path=WorkExperience}"/>

                                <!-- 
                                error:  Cannot find governing FrameworkElement or FrameworkContentElement for target element
                                <wpftoolkit:DataGridComboBoxColumn
                                  
                                  SelectedValueBinding="{Binding Position.Id}"
                                                                   
                                  Header="Position"
                                  ItemsSource="{Binding ElementName=MainWindow, Path=DataContext.EmployeePositionList, diagnostics:PresentationTraceSources.TraceLevel=High}"
                                  DisplayMemberPath="Name"  
                                  SelectedValuePath="Id"                                 
                                  />
                                -->
                                
                            <filter:DataGridComboBoxColumnWithBindingHack Header="Position - List Filter"
                                                                                                                   
                                SelectedItemBinding="{Binding Path=Position}"
                                       
                                ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.EmployeePositionList}"
                                                                          
                                SelectedValuePath="Id"
                                DisplayMemberPath="Name"/>

                            <filter:DataGridComboBoxColumnWithBindingHack Header="Position - Text Filter" 
                                filter:DataGridComboBoxExtensions.IsTextFilter="True"                                                                    
                                SelectedItemBinding="{Binding Path=Position}"                               
                                ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.EmployeePositionList}"                                                                        
                                SelectedValuePath="Id"
                                DisplayMemberPath="Name"/>

                            <filter:DataGridComboBoxColumnWithBindingHack Header="Status"                                                  
                                SelectedValueBinding="{Binding Path=EmployeeStatusId}"                             
                                ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.EmployeeStatuses}"                                                                        
                                SelectedValuePath="Id"
                                DisplayMemberPath="Name"/>
                               
                            <wpftoolkit:DataGridTextColumn Header="Date Of Birth" Binding="{Binding Path=DateOfBirth}"/>
                                
                            <wpftoolkit:DataGridCheckBoxColumn Header="Interviewed" Binding="{Binding Path=IsInterviewed}"/>

                            <wpftoolkit:DataGridTextColumn Header="Work Experience" Binding="{Binding Path=WorkExperience}"/>
   
                        </wpftoolkit:DataGrid.Columns>
                        
                    </wpftoolkit:DataGrid>
                    
                    <StackPanel Orientation="Horizontal" Grid.Row="1">
                        <Label>Displayed rows:</Label>
                        <Label Content="{Binding ElementName=myGrid1, Path=Items.Count}"></Label>
                        <Label Visibility="{Binding IsTestDataGenerationInProgress, Converter={StaticResource BooleanToVisibility}}">Test data generation in progress...</Label>
                        <ProgressBar Margin="0,2,0,0" Visibility="{Binding IsTestDataGenerationInProgress, Converter={StaticResource BooleanToVisibility}}" Value="{Binding TestDataGenerationPercent}" Width="300"></ProgressBar>
                    </StackPanel>
                </Grid>
                
            </TabItem>
            
            <TabItem Header="Tab 2 - AutoGenerateColumns=True">
                
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="*" />
                        <RowDefinition Height="25" />
                    </Grid.RowDefinitions>

                    <wpftoolkit:DataGrid 
                        
                       ColumnHeaderStyle="{StaticResource {ComponentResourceKey 
		                       TypeInTargetAssembly={x:Type filter:DataGridHeaderFilterControl}, 
		                       ResourceId=DataGridHeaderFilterControlStyle}}"
                        
                        AutoGenerateColumns="True"
                        ItemsSource="{Binding Path=EmployeeList}" 
                        Name="myGrid2" 
                        Grid.Row="0"/>

                    <StackPanel Orientation="Horizontal" Grid.Row="1">
                        <Label>Displayed rows:</Label>
                        <Label Content="{Binding ElementName=myGrid2, Path=Items.Count}"></Label>
                    </StackPanel>
                </Grid>
                
            </TabItem>

            <TabItem Header="Tab 3 - No Filter - Standard DataGrid">

                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="*" />
                        <RowDefinition Height="25" />
                    </Grid.RowDefinitions>

                    <wpftoolkit:DataGrid 
                        AutoGenerateColumns="True"
                        ItemsSource="{Binding Path=EmployeeList}" 
                        Name="myGrid3" 
                        Grid.Row="0"/>

                    <StackPanel Orientation="Horizontal" Grid.Row="1">
                        <Label>Displayed rows:</Label>
                        <Label Content="{Binding ElementName=myGrid3, Path=Items.Count}"></Label>
                    </StackPanel>
                </Grid>

            </TabItem>

        </TabControl>
        
    </Grid>
    
</Window>

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The BSD License


Written By
Software Developer Fireminds
Croatia Croatia
Sanjin Matusan - C#, WPF, SQL, .NET

Comments and Discussions