不眨眼地更新ObservableCollection
本文关键字:更新 ObservableCollection | 更新日期: 2023-09-27 18:07:57
有人能帮助我,我怎么能更新ObservableCollection,这是绑定到ListView ItemSource,不眨眼?当我这样做的时候:
Contacs = _contacs;
整个ListView正在闪烁。我也想在ListView中搜索,但总是在用新结果替换旧结果后,ListView会闪烁。
这里的问题是,您正在重新分配整个集合。这没有利用可观察性,并强制ListView重新加载所有项。尝试删除/添加项目,这样ListView只需要更新实际更改的项目。
在搜索隐藏不匹配结果的情况下,可能也是一个可行的解决方案。为此,在Contact类型上创建一个属性(例如称为"IsVisible"),并将其绑定到ListViewItems可见性属性。(您可能需要在这里构建boolean可视性转换器)
正如在评论中指出的,使用CollectionViewSource是实现搜索过滤器的正确wpf方式。
如果你想在集合中启用过滤,那么实际上不需要直接对集合执行操作。
使用ICollectionView
和CollectionViewSource
。
因为你有一个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