刷新ObjectDataProvider时查看丢失

时间:2008-12-21 07:43:13

标签: wpf view objectdataprovider

我正在基于Josh Smith的http://joshsmithonwpf.wordpress.com/2007/06/12/searching-for-items-in-a-listbox示例在列表上实现文本框过滤器。基本上,它将视图上的Filter设置为一个委托,该委托检查搜索框中的文本。我像这样连接过滤器:

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

稍后,当我刷新ObjectDataProvider时,过滤器将丢失。我注意到pickerView.View在刷新后有一个不同的哈希码。数据刷新时是否重新创建了所有视图?这是否意味着每当我调用ObjectDataProvider.Refresh()时我都应该重新连接过滤器?是否有一些更聪明的方法来安装这个不需要保姆的过滤器?

1 个答案:

答案 0 :(得分:4)

当你设置CollectionViewSource.Source时,你会更换CollectionViewSource.View是对的。

解决方案是使用CollectionViewSource.Filter事件而不是CollectionView.Filter属性。当你的视图消失时,它会一直存在。

你可以通过对Josh Smith 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);