Вам не нужно для фильтрации пересобирать коллекцию. Для этого в wpf уже разработаны нужные механизмы.
В первую очередь нужно коллекцию с которой вы работаете поместить в CollectionView. CollectionView привязать к DataGrid.
У CollectionView есть встроенные механизмы фильтрации — результат будет отображаться в DataGrid.
См.
Свойство Filter CollectionView.
Для использования CollectionView обёртывается ещё в CollectionViewSource или что-то подобное. Это подробно описывается в примерах. Его можно просто описать даже в Xaml.
Пример, примерного кода с динамическим созданием CollectionViewSource над List и фильтрацией через TextBox:
Xaml
<Window x:Class="WpfApplication3.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="47*"/>
<RowDefinition Height="275*"/>
</Grid.RowDefinitions>
<TextBox x:Name="filter" TextChanged="filter_TextChanged"/>
<ListBox x:Name="lst" Grid.Row="1" />
</Grid>
</Window>
C#
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
List<string> lstSource = new List<string>() { "1", "2","3" };
viewSource = new CollectionViewSource();
viewSource.Source = lstSource;
viewSource.Filter += viewSource_Filter;
lst.ItemsSource = viewSource.View;
}
CollectionViewSource viewSource;
void viewSource_Filter(object sender, FilterEventArgs e)
{
e.Accepted = ((string)e.Item).IndexOf(filter.Text) >=0;
}
private void filter_TextChanged(object sender, TextChangedEventArgs e)
{
viewSource.View.Refresh();
}
}