我执行一个文本框过滤器上的一个名单的基础上乔希*史密斯的例子 http://joshsmithonwpf.wordpress.com/2007/06/12/searching-for-items-in-a-listbox.基本上,它设置的过滤器上看到的委托检查对该案文在搜索盒。我挂钩的过滤器,像这样:

var pickerView = FindResource("sortedRulesView") as CollectionViewSource;
new TextSearchFilter(pickerView.View, SearchTextBox);

后来,当我刷新ObjectDataProvider,该过滤器丢失。我注意到,pickerView.视具有不同哈希码后进行刷新。是的所有的意见重新当的数据刷新?这是不是意味着我应该重新安装的过滤器再次当我呼ObjectDataProvider.刷新()?是有一些明智的方式来安装这种过滤器,不需要保姆?

有帮助吗?

解决方案

您在说,当CollectionViewSource.Source设置CollectionViewSource.View将被替换是正确的。

的解决方案是使用 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);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top