不眨眼地更新ObservableCollection

本文关键字:更新 ObservableCollection | 更新日期: 2023-09-27 18:07:57

有人能帮助我,我怎么能更新ObservableCollection,这是绑定到ListView ItemSource,不眨眼?当我这样做的时候:

Contacs = _contacs;

整个ListView正在闪烁。我也想在ListView中搜索,但总是在用新结果替换旧结果后,ListView会闪烁。

不眨眼地更新ObservableCollection

这里的问题是,您正在重新分配整个集合。这没有利用可观察性,并强制ListView重新加载所有项。尝试删除/添加项目,这样ListView只需要更新实际更改的项目。

在搜索隐藏不匹配结果的情况下,

可能也是一个可行的解决方案。为此,在Contact类型上创建一个属性(例如称为"IsVisible"),并将其绑定到ListViewItems可见性属性。(您可能需要在这里构建boolean可视性转换器)

正如在评论中指出的,使用CollectionViewSource是实现搜索过滤器的正确wpf方式。

如果你想在集合中启用过滤,那么实际上不需要直接对集合执行操作。

使用ICollectionViewCollectionViewSource

因为你有一个ObservableCollection,所以你可以这样做。

ICollectionView contactsView;
public ICollectionView ContactsView
{
   get { return contactsView; }
   set 
   { 
      if(contactsView != value)
      {
          contactsView = value;
      }
   }
}

ObservableCollection的setter

public ObservableCollection<ContactType> Contacs
{
   get { return _contacs; }
   set
   {
      if(_contacs != value)
      {
         _contacs = value;
         ContactsView = CollectionViewSource.GetDefaultView(value);
         ContactsView.Filter = ContactsFilter;
      }
   }
}

其中ContactsFilter为函数,定义如下:

bool ContactsFilter(object item)
{
   var contact = item as ContactType;
   if(condition)
     return true; //show this item in ListView.
   return false; //Do not show this item in ListView
}

当你想要过滤项目时你可以通过

ContactsView.Refresh();

,我认为它将在您输入搜索查询的文本框的TextChanged事件中。

更详细的文章在CollectionViewSource