Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 自定义IEnumerable作为ListBox的ItemsSource_C#_Wpf_Listbox_Enumerator_Inotifycollectionchanged - Fatal编程技术网

C# 自定义IEnumerable作为ListBox的ItemsSource

C# 自定义IEnumerable作为ListBox的ItemsSource,c#,wpf,listbox,enumerator,inotifycollectionchanged,C#,Wpf,Listbox,Enumerator,Inotifycollectionchanged,我有一个类定义了一个定制的GetEnumerator()函数(通过实现IEnumerable)。我使用它以连续的方式在每个测试步骤中的几个ObservableCollection上迭代。我有一个包含所有所需数据的私有ObservableCollection 我想使用这个类的一个实例作为ListBox的ItemsSource。但是,在更新基础数据(ObservableCollection)时,列表框永远不会更新。下面是该类的一个示例: public class FlatLogViewModel :

我有一个类定义了一个定制的GetEnumerator()函数(通过实现IEnumerable)。我使用它以连续的方式在每个测试步骤中的几个
ObservableCollection
上迭代。我有一个包含所有所需数据的私有
ObservableCollection

我想使用这个类的一个实例作为ListBox的ItemsSource。但是,在更新基础数据(
ObservableCollection
)时,列表框永远不会更新。下面是该类的一个示例:

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;
}
公共类FlatLogViewModel:IEnumerable
{
公共FlatLogViewModel(ObservableCollection子步)
{
m_子步=子步;
}
公共IEnumerator GetEnumerator()
{
foreach(子步中的TestStep步骤)
{
//步骤.LogEvents是一个可观察的集合
foreach(步骤中的LogEvent LogEvent.LogEvents)
收益率事件;
}
IEnumerator IEnumerable.GetEnumerator()
{
返回此.GetEnumerator();
}
私有可观测集合m_子步;
}
我不确定我是否应该/能够在此处实现INotifyCollectionChanged。我如何知道ObservableCollection是否已被修改


我的问题是:如何让列表框显示LogEvents中发生的更改(类型为
ObservableCollection
)?

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

ObservableCollection是一个InotifyCollection已更改。
使用强制转换

var collectionChanged = yourObCollection as INotifyCollectionChanged;

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

在处理程序内部,执行您自己的逻辑来更新项目源

您是否考虑过绑定到原始集合,但通过转换器运行它,以拉出
日志事件
s


转换器应该能够简单地
返回子步骤

是的,但是如何检测底层ObservableCollection何时发生了更改,以便我可以在适当的时候触发CollectionChanged事件?我没有想到这一点,我认为它会起作用,但Dan的解决方案似乎正是我所需要的。谢谢!