更新ObservableCollection而不闪烁

时间:2016-09-21 08:16:25

标签: c# wpf uwp

有人可以帮助我,如何更新ObservableCollection,它绑定到ListView ItemSource,而不会闪烁?当我这样做时:

Contacs = _contacs;

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

2 个答案:

答案 0 :(得分:2)

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

在搜索隐藏的情况下,不匹配的结果也可能是一个可行的解决方案。为此,在Contact类型上创建一个属性(例如,名为" IsVisible")并将其绑定到ListViewItems可见性属性。 (您可能需要在此处使用BooleanToVisibility Converter进行构建)

<强>更新

正如在评论中指出的那样,使用CollectionViewSource是实现搜索过滤器的正确wpf方式。有关如何使用它的详细信息,请参阅this答案。

答案 1 :(得分:1)

如果要在集合中启用过滤,则无需直接对集合执行操作。

为此目的使用watchICollectionView

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

ObservableCollection

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

的制定者中
ObservableCollection

其中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(); 事件中。

更详细的文章位于CollectionViewSource