C# 不闪烁地更新ObservableCollection
有人能帮助我吗,我如何更新绑定到ListView ItemSource的ObservableCollection而不闪烁?当我这样做时:C# 不闪烁地更新ObservableCollection,c#,wpf,uwp,C#,Wpf,Uwp,有人能帮助我吗,我如何更新绑定到ListView ItemSource的ObservableCollection而不闪烁?当我这样做时: Contacs = _contacs; 整个ListView都在闪烁。我也想在ListView中搜索,但总是在用新结果替换旧结果后,ListView会闪烁。这里的问题是,您正在重新分配整个集合。这不会利用可观察性,并强制ListView重新加载所有项。请尝试删除/添加项目,以便ListView只需要更新实际更改的项目 在搜索的情况下,隐藏不匹配的结果可能也是
Contacs = _contacs;
整个ListView都在闪烁。我也想在ListView中搜索,但总是在用新结果替换旧结果后,ListView会闪烁。这里的问题是,您正在重新分配整个集合。这不会利用可观察性,并强制ListView重新加载所有项。请尝试删除/添加项目,以便ListView只需要更新实际更改的项目 在搜索的情况下,隐藏不匹配的结果可能也是一个可行的解决方案。为此,请在联系人类型上创建一个属性(例如称为“IsVisible”),并将其绑定到ListViewItems可见性属性。(此处可能需要内置BooleanToVisibility转换器) 更新
正如在评论中指出的,使用CollectionViewSource是实现搜索过滤器的正确wpf方式。有关如何使用它的详细信息,请参阅答案。如果要在收藏中启用筛选,则实际上不需要直接对收藏执行操作 为此,请使用
ICollectionView
和CollectionViewSource
因为您有一个可观察的集合
,所以您可以这样做
ICollectionView contactsView;
public ICollectionView ContactsView
{
get { return contactsView; }
set
{
if(contactsView != value)
{
contactsView = value;
}
}
}
在可观测集合的设置器中
public ObservableCollection<ContactType> Contacs
{
get { return _contacs; }
set
{
if(_contacs != value)
{
_contacs = value;
ContactsView = CollectionViewSource.GetDefaultView(value);
ContactsView.Filter = ContactsFilter;
}
}
}
无论何时,只要你想过滤项目,你就可以通过
ContactsView.Refresh();
我认为这将出现在您输入搜索查询的文本框的TextChanged
事件中
更详细的文章在你所说的更新是什么意思?您是替换整个OC还是添加/删除记录。我替换整个集合。@rbm您所说的“双缓冲”与问题完全无关。用户要求提供更好的方式来通知UI后台发生了什么。双缓冲区是一种位图优化技术,它只对Winforms(不在UWP/WPF中)有效@MarioVernari-我明白了,谢谢你指出这一点。这很有意义,当我用新数据替换集合时,它会闪烁。因此,我应该只使用现有的源代码并添加/删除项。您的搜索解决方案很好。这是一个很好的技巧,但当您使用CollectionViewSource和ICollectionView具有内置功能时,您不需要它。也许我将创建从ObservableCollection派生的排序集合。UWP中不支持CollectionViewSource的筛选器属性。对UWPCommunityToolkit的请求提出了您希望实现的内容。谢谢。我试试看当然让我知道进展如何。我建议这样做是因为它分离了你的过滤逻辑。我有一个问题。属性筛选器不在UWP中:/I我已经看到,显然UWP中不支持这一点。你的问题不仅仅针对uwp。我从WPF的角度回答了这个问题,并且得到了支持。我猜您必须对直接可观察收集进行过滤,或者您可以采用这种方法。
ContactsView.Refresh();