ICollectionView 的过滤问题
Filtering issue with ICollectionView
ImageAlbums
是 ICollectionView
类型,GlobalCollection.MyImageAlubms
是 ObservableCollection<T>
类型。
ImageAlbums = CollectionViewSource.GetDefaultView(GlobalCollection.MyImageAlubms);
ImageAlbums.Filter = new Predicate<object>(this.FilterImageAlbumList);
在一个视图中,我使用 ImageAlbums 显示过滤后的图像列表。我已经使用 FilterImageAlbumList
方法过滤了列表。问题是我在另一个地方使用了 GlobalCollection.MyImageAlubms
。在该视图中,我直接将 GlobalCollection.MyImageAlubms 用作源,但其中的列表也显示为已过滤。我这里也提供了filter方法,下面代码代表filter方法
private bool FilterImageAlbumList(object item)
{
AlbumModel albumMoel = (AlbumModel)item;
if(LOGIC_OF_FILTERING)
{
return false;
}
return true;
}
有没有办法只过滤ImageAlbums
而不影响全局Collection。仅供参考 - 我不会深入复制全局 Collection。
您的问题是由以下两个事实引起的:
- 每个集合实例有只有一个默认(实例)视图,因此
CollectionViewSource.GetDefaultView
总是returns相同参数的相同实例
- WPF绑定机制不直接绑定到集合,而是绑定到其默认的集合视图
因此,如果您在默认视图上设置过滤器,无论您绑定到集合,其效果都可见。
如果您想要 ICollectionView
的单独实例,最好的办法是手动实例化它。对于 ObservableCollection<T>
,一个不错的选择是 ListCollectionView
。所以这应该可以解决您的问题:
ImageAlbums = new ListCollectionView(GlobalCollection.MyImageAlubms);
ImageAlbums
是 ICollectionView
类型,GlobalCollection.MyImageAlubms
是 ObservableCollection<T>
类型。
ImageAlbums = CollectionViewSource.GetDefaultView(GlobalCollection.MyImageAlubms);
ImageAlbums.Filter = new Predicate<object>(this.FilterImageAlbumList);
在一个视图中,我使用 ImageAlbums 显示过滤后的图像列表。我已经使用 FilterImageAlbumList
方法过滤了列表。问题是我在另一个地方使用了 GlobalCollection.MyImageAlubms
。在该视图中,我直接将 GlobalCollection.MyImageAlubms 用作源,但其中的列表也显示为已过滤。我这里也提供了filter方法,下面代码代表filter方法
private bool FilterImageAlbumList(object item)
{
AlbumModel albumMoel = (AlbumModel)item;
if(LOGIC_OF_FILTERING)
{
return false;
}
return true;
}
有没有办法只过滤ImageAlbums
而不影响全局Collection。仅供参考 - 我不会深入复制全局 Collection。
您的问题是由以下两个事实引起的:
- 每个集合实例有只有一个默认(实例)视图,因此
CollectionViewSource.GetDefaultView
总是returns相同参数的相同实例 - WPF绑定机制不直接绑定到集合,而是绑定到其默认的集合视图
因此,如果您在默认视图上设置过滤器,无论您绑定到集合,其效果都可见。
如果您想要 ICollectionView
的单独实例,最好的办法是手动实例化它。对于 ObservableCollection<T>
,一个不错的选择是 ListCollectionView
。所以这应该可以解决您的问题:
ImageAlbums = new ListCollectionView(GlobalCollection.MyImageAlubms);