2016-11-29 7 views
0

ImageAlbumsICollectionView 유형이고 GlobalCollection.MyImageAlubmsObservableCollection<T> 유형입니다.ICollectionView에서의 필터링 문제

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

보기에서는 필터링 된 이미지 목록을 표시하기 위해 ImageAlbums를 사용하고 있습니다. 나는 FilterImageAlbumList 방법을 사용하여 목록을 필터링했습니다. 문제는 내가 다른 곳에서 을 사용했다는 것입니다. 그 견해에서 나는 GlobalCollection.MyImageAlubms를 소스로 직접 사용했지만 목록에는 필터링 된 것으로 보여지고있다. 또한 코드를 다음은 필터 방식

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

GlobalCollection에 영향을주지 않고 단지 ImageAlbums을 필터링 할 수있는 방법이 있나요에게 나타냅니다, 여기에 필터 방법을 제공하고있다. 참고 - 전 세계 컬렉션을 자세히 복사하지 않겠습니다.

+0

항목은 유형이므로 테스트 할 수 있습니다. 각 클래스에는 유형에 대해 다른 열거 형이 있습니다. – jdweng

+0

'new CollectionViewSource {Source = GlobalCollection.MyImageAlubms} .View;를 사용하여 새 뷰를 생성 할 수 있지만 과거에이 버그를 발견했습니다 (http://stackoverflow.com/questions/37166747/object-reference-not -set-to-an-object-in-presentationframework) 그리고 단지 사본을 생성하는 것을 끝내 었습니다 ... – Joe

+0

@Joe, 당신이 왜이 버그를 발견했는지 당신이 이것을 제안하고있다? – lukai

답변

2

귀하의 문제는이 두 가지 사실에 의해 발생합니다 :

  1. 각 컬렉션 인스턴스 하나 개의 기본 뷰 (의 예), 따라서 CollectionViewSource.GetDefaultView 항상 같은 인수
  2. 에 대해 동일한 인스턴스를 반환있다 WPF 바인딩 메커니즘이 컬렉션에 직접 바인딩되지 않고 기본 컬렉션 뷰로 연결됩니다.

그래서 필트를 설정하면 기본보기에서 r을 클릭하면 컬렉션에 바인딩 할 때마다 해당 효과가 표시됩니다.

ICollectionView의 별도 인스턴스를 수동으로 인스턴스화하는 것이 가장 좋습니다. 의 경우 좋은 선택은 ListCollectionView입니다. 그러면 문제가 해결됩니다.

ImageAlbums = new ListCollectionView(GlobalCollection.MyImageAlubms);