有人可以帮助我,如何更新ObservableCollection,它绑定到ListView ItemSource,而不会闪烁?当我这样做时:
Contacs = _contacs;
整个ListView闪烁。我也想在ListView中搜索,但是在用新的结果替换旧结果后,listview会闪烁。
答案 0 :(得分:2)
这里的问题是,你要重新分配整个集合。这不利用可观察性并强制ListView重新加载所有项目。尝试删除/添加项目,以便ListView只需要更新实际更改的项目。
在搜索隐藏的情况下,不匹配的结果也可能是一个可行的解决方案。为此,在Contact类型上创建一个属性(例如,名为" IsVisible")并将其绑定到ListViewItems可见性属性。 (您可能需要在此处使用BooleanToVisibility Converter进行构建)
<强>更新强>
正如在评论中指出的那样,使用CollectionViewSource是实现搜索过滤器的正确wpf方式。有关如何使用它的详细信息,请参阅this答案。
答案 1 :(得分:1)
如果要在集合中启用过滤,则无需直接对集合执行操作。
为此目的使用watch
和ICollectionView
。
因为你有一个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