2009-04-22 7 views
12

私は2つのObservableCollectionを持っており、それらを一緒に1つのListViewコントロールに表示する必要があります。この目的のために、これら2つのコレクションを1つのObservableCollectionとして提示するMergedCollectionを作成しました。これにより、ListView.ItemsSourceをマージされたコレクションに設定でき、両方のコレクションがリストされます。追加すると、正常に動作しますが、私はアイテムを削除しようとすると、未処理の例外が表示されます。Merged ObservableCollection

An unhandled exception of type 'System.InvalidOperationException' occurred in PresentationFramework.dll 
Additional information: Added item does not appear at given index '2'. 

MergedCollectionのコードは、次のとおりです。

public class MergedCollection : IEnumerable, INotifyCollectionChanged 
{ 
    ObservableCollection<NetworkNode> nodes; 
    ObservableCollection<NodeConnection> connections; 

    public MergedCollection(ObservableCollection<NetworkNode> nodes, ObservableCollection<NodeConnection> connections) 
    { 
     this.nodes = nodes; 
     this.connections = connections; 

     this.nodes.CollectionChanged += new NotifyCollectionChangedEventHandler(NetworkNodes_CollectionChanged); 
     this.connections.CollectionChanged += new NotifyCollectionChangedEventHandler(Connections_CollectionChanged); 
    } 

    void NetworkNodes_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
    { 
     CollectionChanged(this, e); 
    } 

    void Connections_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
    { 
     CollectionChanged(this, e); 
    } 

    #region IEnumerable Members 

    public IEnumerator GetEnumerator() 
    { 
     for (int i = 0; i < connections.Count; i++) 
     { 
      yield return connections[i]; 
     } 

     for (int i = 0; i < nodes.Count; i++) 
     { 
      yield return nodes[i]; 
     } 
    } 

    #endregion 

    #region INotifyCollectionChanged Members 

    public event NotifyCollectionChangedEventHandler CollectionChanged; 

    #endregion 
} 

よろしく

答えて

21

をあなたができない何らかの理由がありますCompositeCollectionを使用しますか?

例外がスローされる理由は、内側のコレクションのインデックスを外側に変換していないためです。まったく同じイベント引数を外部イベント(MergedCollection)に渡すだけです。そのため、WPFは、インデックスで検索するアイテムを見つけられません。

+0

CompositeCollectionはINotifyCollectionChangedを実装していません。 –

+1

@ジョシュ:リンクをたどると、そのリンクが表示されます。 –

+0

:-)あなたは正しい、ケント。それは最高です。私はリンクをたどったが、コレクションが実装しているインターフェイスが2行であることに気付かなかった!私はIListだけ見た! –

4

通知イベントのインデックスをオフセットする必要があります。

は、あなたが変更されたイベントのコレクションはあなたがインデックス2の第2のコレクションから項目を削除した場合、イベントがで解雇されたインデックス2

で解雇されたインデックス2で最初のコレクションから項目を削除すると言います同じインデックス(2)が、最初のコレクションのすべてのアイテムの後に実際に列挙されます。

+0

ケントの解決策は良いですが、記録のために、元々あなたのクラスに間違っていたものがあります。 –

+0

ありがとう、今私は問題を理解する。例外メッセージは、時には私にとって少しトリッキーです。 – Zefo