2013-06-30 2 views
5

ObservableCollection을 유형 (AddPoint 유형)을 기반으로 하위 집합으로 필터링하고 중복없이 오름차순으로 정렬하려고합니다. 내 기본 클래스는 ModelBase, 서브 클래스 AddPoint, 시간, 반복 등 ... ObservableCollection MotionSequenceCollection은 임의의 순서로 해당 유형으로 채워지고 일부는 중복됩니다.WPF 바인딩 필터링 ObservableCollection ICollectionView to Combobox

나는 여러 번 시도해 보았고 아래에서 ICollectionView 속성에 표시했습니다. 그 위치는 'from'from Bind subset of collection입니다.

관찰 COLLECTION은 유형별로

private ObservableCollection<ModelBase> _motionSequenceCollection = 
     new ObservableCollection<ModelBase>(); 

    public ObservableCollection<ModelBase> MotionSequenceCollection 
    { 
     get 
     { 
      return _motionSequenceCollection; 
     } 

     set 
     { 
      if (_motionSequenceCollection == value) 
      { 
       return; 
      } 

      var oldValue = _motionSequenceCollection; 
      _motionSequenceCollection = value; 

      // Update bindings, no broadcast 
      RaisePropertyChanged(); 
     } 
    } 

    public ICollectionView Location 
    { 
     get 
     { 
      var location = CollectionViewSource.GetDefaultView(_motionSequenceCollection); 

      //DOES NOT WORK. PROBLEM: GetType() creates type of system.type() and AddPoint, which don't work. Need a cast, or something?? 
      // found at https://stackoverflow.com/questions/9621393/bind-subset-of-collection The problem is that there is an error: 
      // Cannot apply operator '==' to operands of type 'System.Type' and 'MotionSeq.Model.AddPoint', 
      // candidates are: 
      //   bool ==(System.Reflection.MemberInfo, System.Reflection.memberInfo) (in class MemberInfo) 
      //   bool ==(System.type, System.Type) (in class Type) 
      //location.Filter = p => (p as ModelBase).GetType() == AddPoint; 

      //DOES NOT WORK. PROBLEM: Affects the main collection and won't let TIME type added. 
      //location.Filter = o1 => (o1 is AddPoint); 

      //DOES NOT WORK. PROBLEM: Sorts fine, but also sorts MotionSequenceCollection!! What up w/ that!? 
      //location.SortDescriptions.Add(new SortDescription("AddPointClassName", ListSortDirection.Ascending)); 

      //DOES NOT WORK. PROBLEM: MotionSequenceCollection does not update. 
      //location.Filter = p => (p as ModelBase) == AddPoint; 

      //DOES NOT WORK. PROBLEM: Source is not instantiated(?) and exmaple from stackoverflow and not sure how that got there in the first place. 
      //source.Filter = p => (p as ModelBase).GetType() == "AddPoint"; 
      //return source; 

      return location; 
     } 
    } 

답변

2

모든 컬렉션에는 기본 CollectionView가 있습니다. WPF는 항상 컬렉션이 아닌보기에 바인딩됩니다. 컬렉션에 직접 바인딩하면 WPF는 실제로 해당 컬렉션의 기본보기에 바인딩됩니다. 이 기본보기는 콜렉션에 대한 모든 바인딩에 의해 공유되므로 컬렉션에 대한 모든 직접 바인딩이 하나의 기본보기의 정렬, 필터, 그룹 및 현재 항목 특성을 공유합니다.

는 시도는 다음과 같이 자사의 필터링 논리를 CollectionViewSource를 생성하고 설정 :

//create it as static resource and bind your ItemsControl to it 
<CollectionViewSource x:Key="csv" Source="{StaticResource MotionSequenceCollection}" 
        Filter="CollectionViewSource_Filter"> 
    <CollectionViewSource.GroupDescriptions> 
     <PropertyGroupDescription PropertyName="YYY"/> 
    </CollectionViewSource.GroupDescriptions> 
    <CollectionViewSource.SortDescriptions> 
     <scm:SortDescription PropertyName="YYY" Direction="Ascending"/> 
    </CollectionViewSource.SortDescriptions> 
</CollectionViewSource> 

private void CollectionViewSource_Filter(object sender, FilterEventArgs e) 
{ 
    var t = e.Item as ModelBase; 
    if (t != null) 

    { 
     //use your filtering logic here 

    } 
} 
+0

솔직히, 나는 이것에 다량으로 고투하고있다. 나는 원래 @ makc의 방법으로/CollectionViewSource_FIlter를 보았고 도움이 될만한 몇 가지 예제를 발견했다. 그러나 문제는 목록을 구별 짓는 것과 관련이 있었다. - 그것은 2 일 전이었고 내 머리는 안개가 낀다. 필터는 다음과 같습니다 : – FloppyDisk

+0

내 의견을 수정해야합니다. 나는 당신의 솔루션을 작동시키고 collectionviewsource에 대해 많은 것을 배웠다. 문제는 중복이 있고 콤보 상자 (필터링 된 뷰)에 하나만 표시된다면 컬렉션에서 편집 할 때 새로 추가하여 업데이트하지 않는다는 것이다 편집 된 기록. 하나만 있으면 속성 변경 후 예상대로 업데이트됩니다. 그 이유는 내가 linq 경로를 따라 갔지만, 그 재앙이 입증되었습니다. – FloppyDisk

+0

@FloppyDisk 나는 당신이 단지 과거를 복사하지 않고 읽었고 배웠다는 것을 매우 기쁘게 생각합니다. :) 나는 작은 문제를 완전히 이해하려고 노력하고 있으며, 새로운 질문을할만한 가치가 있다고 생각합니다. – makc

1

필터링은 간단합니다. 그래야 작동합니다 :

location.Filter = p => p.GetType() == typeof(AddPoint); 

정렬도 매우 쉽습니다. IComparer을 구현하고이를 컬렉션보기의 CustomSort 속성에 지정하면됩니다.

중복을 제거하는 쉬운 방법은 없습니다. (알고 있지는 않습니다.) 나는 당신이 다른 곳에 그것을 할 것을 제안한다. 예를 들어 기본 컬렉션을 구별 할 수 있습니다.

+0

나는 나의 압정을 변경하고 LINQ와의 ObservableCollection에의 하위 집합을 만들려고. 그런 다음 다시 내 견해에 묶어 라. 그것은 진지한 돌풍이었습니다. IComparer를 구현해야한다는 오류가 있습니다. 그걸 보면서. 응답 해 주셔서 감사합니다. – FloppyDisk