自定义IEnumerable作为ListBox的ItemsSource

时间:2014-03-25 20:07:56

标签: c# wpf listbox enumerator inotifycollectionchanged

我有一个定义了自定义GetEnumerator()函数的类(通过实现IEnumerable&lt;&gt;)。我使用它以连续的方式迭代每个TestStep中的几个ObservableCollection<LogEvent>。我有一个包含所有必需数据的私有ObservableCollection<TestStep>

我想使用此类的实例作为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?

我的问题是:如何让ListBox显示LogEvents中发生的变化(类型为ObservableCollection<LogEvent>)?

2 个答案:

答案 0 :(得分:1)

当ObservableCollection发生变化时,ListBox如何知道?你必须像你提到的那样实现INotifyCollectionChanged,然后在事件处理程序中使用新的可枚举数据更新ItemSource。

ObservableCollection is an INotifyCollectionChanged.使用强制转换

var collectionChanged = yourObCollection as INotifyCollectionChanged;

 if( collectionChanged !=null)
{
   collectionChanged.CollectionChanged += YourEventHandler; 
}
处理程序内部的

执行您自己的逻辑以更新项目源

答案 1 :(得分:1)

您是否考虑过绑定到原始集合,但是通过转换器运行它以取出LogEvent

转换器应该只能return subSteps.SelectMany(s => s.LogEvents)