2012-01-02 3 views
0

.NET 3.5 SP1에서 사용자 지정 개체 목록에 필터를 추가하려고합니다. 내 객체는 다음과 같다 :목록 내의 목록에서 콤보 상자 채우기

public class Message { 
    string Filename; 
    DateTime Timestamp; 
    List<ClassA> A; 
    List<ClassB> B; 
    // ... 
} 

public class ClassA { 
    string Name; 
    // ... 
} 

public class ClassB { 
    string Description; 
    // ... 
} 

내 모든 메시지를 들고 ObservableCollection에있다; 각 메시지에는 2 개 이상의 ClassA와 0 ~ n ClassB가 있습니다. 이미 ListView를 설정하여 (CollectionViewSource를 통해 정렬 된) 메시지를 표시합니다.

이제이 ListView를 필터링 할 수 있도록 두 개의 ComboBox를 UI에 추가하려고합니다. 물론 그들은 중복을 포함해서는 안됩니다. 따라서 ClassA.Names와 ClassB.Descriptions는 모두 입니다. 현재 ListView에 표시된 메시지입니다. 또한 하나의 ComboBox 필터를 다른 필터에도 적용해야합니다.

ListView의 필터링이 이미 완료되어 작동하지만 ComboBoxes를 채우는 방법을 알 수 없습니다.

답변

0

이 작동해야하는 위치 메시지입니다 필터링 된 메시지 모음 :

var distinctNames = 
    (from message in Messages 
    from a in message.A 
    select a.Name).Distinct(); 

var distinctDescriptions = 
    (from message in Messages 
    from b in message.B 
    select b.Description).Distinct(); 
+0

이 작품은, 대단히 감사합니다, 그들 또한 예를 들어,이 경우에 를 사용하여 대소 문자를 구분하는 것입니다. 훨씬 더 깨끗하고 내가 상상했던 것보다 우아함 :) 그러나 메시지를 나타내는 필터링 된 CollectionViewSource에 액세스하는 방법을 알 수 없습니다. 나에게 힌트를 줄 수 있니? – Velines

+0

CVS.View.OfType 을 사용하여 해결했습니다. 귀하의 게시물에 다시 한 번 감사드립니다. – Velines

0

내가 바로 당신이 유형 AB을 입력에 대한 구성원 컬렉션의 특성 string 값을 기준으로 List<Messages> 수집을 필터링 할 이해한다면 . 그렇다면

,이 같은 당신을 작동합니다 : 여기에 내가 쿼리 및 StartsWith 문자열 함수에 연산자를 넣어

var msgs = messagies.Select(ms=>ms).Where(ms=>ms.A.Exists(cla=>cla.Name.StartsWith("NameToSearch") && 
     ms.B.Exists(clb=>clb.Description.StartsWith("DescriptionToSearch")))); 

참고. 당신은 당신의 필요에 더 적합한 기능과 운영자로 그들을 대체 할 수 있습니다.

편집 :

좋은 점은

StartsWith("DescriptionToSearch",StringComparison.InvariantCultureIgnoreCase))

+0

꽤 괜찮은 느낌입니다. 메시지를 담고있는 ObservableCollection으로 이것을 수행 할 수있는 방법이 있습니까? – Velines

+0

CVS.View.OfType 을 사용하여 해결했습니다. 귀하의 게시물에 다시 한 번 감사드립니다. – Velines

관련 문제