【问题标题】:View lost when refreshing ObjectDataProvider刷新 ObjectDataProvider 时视图丢失
【发布时间】:2008-12-21 07:43:13
【问题描述】:

我正在根据 Josh Smith 在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.View 在刷新后具有不同的哈希码。数据刷新时是否重新创建了所有视图?这是否意味着每当我调用 ObjectDataProvider.Refresh() 时都应该重新附加过滤器?有没有更聪明的方法来安装这个不需要保姆的过滤器?

【问题讨论】:

    标签: wpf view objectdataprovider


    【解决方案1】:

    你说得对,当 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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-30
      • 2017-04-19
      • 1970-01-01
      • 2010-12-19
      • 2020-03-25
      • 2011-02-01
      • 2014-05-24
      • 2019-09-12
      相关资源
      最近更新 更多