我有一个定义了自定义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>
)?
答案 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)
。