Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 不闪烁地更新ObservableCollection_C#_Wpf_Uwp - Fatal编程技术网

C# 不闪烁地更新ObservableCollection

C# 不闪烁地更新ObservableCollection,c#,wpf,uwp,C#,Wpf,Uwp,有人能帮助我吗,我如何更新绑定到ListView ItemSource的ObservableCollection而不闪烁?当我这样做时: Contacs = _contacs; 整个ListView都在闪烁。我也想在ListView中搜索,但总是在用新结果替换旧结果后,ListView会闪烁。这里的问题是,您正在重新分配整个集合。这不会利用可观察性,并强制ListView重新加载所有项。请尝试删除/添加项目,以便ListView只需要更新实际更改的项目 在搜索的情况下,隐藏不匹配的结果可能也是

有人能帮助我吗,我如何更新绑定到ListView ItemSource的ObservableCollection而不闪烁?当我这样做时:

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();