Вы правы, говоря, что CollectionViewSource.View будет заменен, когда установлен CollectionViewSource.Source.
Решение заключается в использовании события CollectionViewSource.Filter вместо свойства CollectionView.Filter . Это останется, когда ваш вид исчезнет.
Вы можете сделать это с минимальными изменениями в классе TextSearchFilter Джоша Смита :
public class TextSearchFilter
{
public TextSearchFilter(
CollectionViewSource filteredView,
TextBox textBox )
{
string filterText = "";
filteredView.Filter += delegate( object obj, FilterEventArgs e )
{
if( String.IsNullOrEmpty( filterText ) )
e.Accepted = true;
string str = e.Item as string;
if( String.IsNullOrEmpty( str ) )
e.Accepted = false;
int index = str.IndexOf(
filterText,
0,
StringComparison.InvariantCultureIgnoreCase );
e.Accepted = index > -1;
};
textBox.TextChanged += delegate
{
filterText = textBox.Text;
filteredView.View.Refresh();
};
}
}
Ваш код подключения становится:
var pickerView = FindResource("sortedRulesView") as CollectionViewSource;
new TextSearchFilter(pickerView, SearchTextBox);