The goal of this article is to show how to get the filtered items from a GridView (here we will use Telerik RadGridView, but it should be the same for any Grid).

This case is really useful if you need to apply some calculation on a filtered subset of the Data you’re displaying, while you’re still having access to the full collection for other calculations.

 The View:

<Window x:Class="Telerik_FilteredGridValues_Collection.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation"
        mc:Ignorable="d"
        Title="MainWindow" Height="600" Width="600">

    <Grid>
        <StackPanel Orientation="Vertical">
            <TextBlock Text="{Binding TextValue}" />
            <telerik:RadGridView x:Name="grid" ItemsSource="{Binding FilteredItems2}"></telerik:RadGridView>
            <Button Content="Ok" Command="{Binding OkCommand}" Click="ButtonBase_OnClick" />
        </StackPanel>
    </Grid>

</Window>


The code-behind:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using Telerik_FilteredGridValues_Collection.ViewModel;

namespace Telerik_FilteredGridValues_Collection
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            DataContext = new MainVM();
        }
 
        private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
        {
            //This works as well, but not MVVM...
            var test = grid.Items.Cast<Person>();
        }
    }
}


The View-Model:

using Microsoft.Practices.Prism.Mvvm;
using System.Collections.ObjectModel;
using System.Windows.Input;
using Telerik.Windows.Data;

namespace Telerik_FilteredGridValues_Collection.ViewModel
{
    public class MainVM : BindableBase
    {
        private string _textValue;
        public string TextValue
        {
            get
            {
                return _textValue;
            }
            set
            {
                if (value != _textValue)
                {
                    _textValue = value;
                    OnPropertyChanged(() => TextValue);
                }
            }
        }

        private ObservableCollection<Person> _items;
        public ObservableCollection<Person> Items
        {
            get
            {
                return _items ?? (_items = new ObservableCollection<Person>());
            }
            set
            {
                if (value != _items)
                {
                    _items = value;
                    OnPropertyChanged(() => Items);
                }
            }
        }

        //Doesn't work with Telerik !!
        //private ICollectionView _filteredItems;
        //public ICollectionView FilteredItems
        //{
        //    get { return _filteredItems; }
        //    set { _filteredItems = value; }
        //}

        //Works with Telerik !!
        private QueryableCollectionView _filteredItems2;
        public QueryableCollectionView FilteredItems2
        {
            get { return _filteredItems2; }
            set { _filteredItems2 = value; }
        }
 
        private ICommand _okCommand;
        public ICommand OkCommand
        {
            get
            {
                return _okCommand ?? (_okCommand = new Microsoft.Practices.Prism.Commands.DelegateCommand(OkPressed));
            }
        }

        public MainVM()
        {
            TextValue = "This is a test of Filtered Values in a Telerik GridView.";
            Items.Add(new Person { Name = "Steeve", Age = 33 });
            Items.Add(new Person { Name = "Claire", Age = 37 });
            Items.Add(new Person { Name = "Jimmy", Age = 32 });
            Items.Add(new Person { Name = "Pascal", Age = 52 });

            //Doesn't work with Telerik !
            //FilteredItems = CollectionViewSource.GetDefaultView(Items);

            //Works with Telerik!
            FilteredItems2 = new QueryableCollectionView(Items);
       }

        private void OkPressed()
        {
            foreach (var filteredItem in FilteredItems2)
            {
                //Here we have our filtered items from the Grid
            }
        }
    }

    public class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }
}

BindableBase is part of the NuGet package Prism.MVVM. It’s simply an implementation of INotifyPropertyChanged.

The concept is to get a “View” of the represented Data on screen.

So as you can see in this code, ICollectionView (System.ComponentModel which could be a ListCollectionView for example) should work with any Grid, but it seems that the Telerik controls can have some issues. But they work perfectly with a QueryableCollectionView (from Telerik.Windows.Data). 

Happy coding!