使用ICollectionView过滤问题

时间:2016-11-29 10:18:00

标签: c# wpf xaml icollectionview

ImageAlbumsICollectionView类型,GlobalCollection.MyImageAlubmsObservableCollection<T>类型。

ImageAlbums = CollectionViewSource.GetDefaultView(GlobalCollection.MyImageAlubms);
ImageAlbums.Filter = new Predicate<object>(this.FilterImageAlbumList);

在视图中,我使用ImageAlbums显示过滤后的图像列表。我使用FilterImageAlbumList方法过滤了列表。问题是我在另一个地方使用了GlobalCollection.MyImageAlubms。在该视图中,我直接使用GlobalCollection.MyImageAlubms作为源,但在那里列表也显示为已过滤。我也在这里提供过滤方法,下面的代码表示过滤方法

private bool FilterImageAlbumList(object item)
{
    AlbumModel albumMoel = (AlbumModel)item;
    if(LOGIC_OF_FILTERING)
    {
        return false;
    }
    return true;
}

有没有办法只过滤ImageAlbums而不影响GlobalCollection。仅供参考 - 我不会深刻复制全球收藏。

1 个答案:

答案 0 :(得分:3)

您的问题是由以下两个事实引起的:

  1. 每个集合实例都有只有一个默认(视图的实例)视图,因此CollectionViewSource.GetDefaultView始终为同一个参数返回相同的实例
  2. WPF 绑定机制不直接绑定到集合,而是绑定到其默认集合视图
  3. 因此,如果您在默认视图上设置过滤器,则无论您绑定到集合的哪个位置,其效果都会显示。

    如果你想要ICollectionView的单独实例,最好的办法就是手动实例化它。对于ObservableCollection<T>,一个不错的选择是ListCollectionView。所以这应该可以解决你的问题:

    ImageAlbums = new ListCollectionView(GlobalCollection.MyImageAlubms);