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