2014-03-25 10 views
0

IEnumerable <을 구현하여 사용자 지정 GetEnumerator() 함수를 정의하는 클래스가 있습니다. 나는 모든 TestStep에있는 몇 가지 ObservableCollection<LogEvent>에 걸쳐 연속적인 방식으로 반복하는데 사용한다. 모든 필요한 데이터가 포함 된 개인 ObservableCollection<TestStep> 있습니다.ListBox의 ItemsSource로 사용자 지정 IEnumerable

이 클래스의 인스턴스를 ListBox의 ItemsSource로 사용하고 싶습니다. 그러나 기본 데이터 (ObservableCollection<LogEvent>)가 업데이트되면 ListBox가 업데이트되지 않습니다. 다음은 해당 클래스의 샘플입니다.

public class FlatLogViewModel : IEnumerable<LogEvent> 
{ 
    public FlatLogViewModel(ObservableCollection<TestStep> subSteps) 
    { 
     m_subSteps = subSteps;    
    } 

    public IEnumerator<LogEvent> GetEnumerator() 
    { 
     foreach (TestStep step in SubSteps) 
     { 
      // step.LogEvents is an ObservableCollection<LogEvent> 
      foreach (LogEvent logEvent in step.LogEvents) 
       yield return logEvent; 
    } 

    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return this.GetEnumerator(); 
    } 

    private ObservableCollection<TestStep> m_subSteps; 
} 

여기서 INotifyCollectionChanged를 구현할 수 있는지 여부는 잘 모르겠습니다. ObservableCollection이 수정되었는지 어떻게 알 수 있습니까?

제 질문은 : LogEvents (ObservableCollection<LogEvent>)에서 일어나는 변경 사항을 ListBox에 표시하려면 어떻게해야합니까?

답변

1

ObservableCollection이 변경되면 ListBox는 어떻게 알 수 있습니까? INotifyCollectionChanged를 언급 한 것처럼 구현 한 다음 ItemSource를 이벤트 처리기 내에서 새로운 열거 가능 데이터로 업데이트해야합니다.

ObservableCollection is an INotifyCollectionChanged. 사용하면 항목 소스를 업데이트하기 위해 자신의 논리를 할 핸들러 내부

var collectionChanged = yourObCollection as INotifyCollectionChanged; 

if(collectionChanged !=null) 
{ 
    collectionChanged.CollectionChanged += YourEventHandler; 
} 

캐스팅

+0

예. 기본 ObservableCollection이 변경된 시점을 감지하여 적절한 순간에 CollectionChanged 이벤트를 발생시킬 수있는 방법은 무엇입니까? – Michael

+0

나는 대답을 –

+0

업데이트했습니다. 정확히 내가 필요한 것, 감사합니다! – Michael

1

는 원래 컬렉션에 바인딩하지만 꺼내하기 위해 컨버터를 통해 실행 된 것으로 간주 되세요 LogEvent s?

변환기는 간단하게 return subSteps.SelectMany(s => s.LogEvents)이어야합니다.

+0

나는 이것에 대해 생각하지 않았다, 나는 그것이 효과가있을 것이라고 생각하지만, Dan의 해결책은 정확하게 내가 필요한 것 같다. 감사! – Michael