0

カスタム GetEnumerator() 関数を定義するクラスがあります (IEnumerable<> を実装することにより)。私はそれを使用してObservableCollection<LogEvent>、すべての TestStep にある複数の連続した方法で繰り返します。ObservableCollection<TestStep>必要なすべてのデータを含むプライベートがあります。

このクラスのインスタンスを ListBox の ItemsSource として使用したいと考えています。ObservableCollection<LogEvent>ただし、基になる data( ) が更新されても、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>) で発生した変更を表示するにはどうすればよいですか?

4

2 に答える 2

1

ObservableCollection が変更されたとき、ListBox はどのようにそれを知るのでしょうか? INotifyCollectionChanged に言及したように実装してから、イベント ハンドラー内の新しい列挙可能なデータで ItemSource を更新する必要があります。

ObservableCollection is an INotifyCollectionChanged.キャストを使用する

var collectionChanged = yourObCollection as INotifyCollectionChanged;

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

ハンドラー内で独自のロジックを実行して項目ソースを更新します

于 2014-03-25T20:18:42.080 に答える