【问题标题】:Filtering issue with ICollectionViewICollectionView 的过滤问题
【发布时间】:2016-11-29 10:17:59
【问题描述】:

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。仅供参考 - 我不会深度复制全局集合。

【问题讨论】:

  • 由于 item 是一个对象,您可以测试类型。每个类都有不同的类型枚举。
  • 您可以使用new CollectionViewSource { Source = GlobalCollection.MyImageAlubms}.View; 创建一个新视图,但是我在过去发现了这个错误 (stackoverflow.com/questions/37166747/…),最后只是创建了副本...
  • @Joe,如果你发现这个问题,你为什么要推荐这个?
  • @lukai 这就是为什么我把它作为评论而不是答案。只是给出选择。其他人可能会在不知道它的错误的情况下建议它作为答案。
  • @Joem 谢谢。不过已经得到了解决方案。

标签: c# wpf xaml icollectionview


【解决方案1】:

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

  1. 每个集合实例只有一个默认(的实例)视图,因此CollectionViewSource.GetDefaultView 总是为相同的参数返回相同的实例
  2. WPF 绑定机制不直接绑定到集合,而是绑定到它的默认集合视图

因此,如果您在默认视图上设置过滤器,则无论您绑定到集合的任何位置,都可以看到其效果。

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

ImageAlbums = new ListCollectionView(GlobalCollection.MyImageAlubms);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-09
    • 2016-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-20
    相关资源
    最近更新 更多