0

次のような観察可能なコレクションの階層があります。

interface IItem
{
    ObservableCollection<IItem> Children { get; }
}

IItem(または ) を指定すると、すべての子アイテムObservableCollection<IItem>を再帰的に含む他の監視可能なコレクションを構築したいと考えています。IItemこのコレクションは、(たとえば) WPF リスト ビューのデータ ソースとして使用されます。

これらの項目のいずれかを変更して追加の子を持つようにすると、結果の監視可能なコレクションが更新されます。循環参照がないことに注意してください。

私はCompositeCollection クラスを認識しており、これが役立つはずだと確信しています (必要なのは、 の各子の複合コレクションを再帰的に含む複合コレクションChildrenだけだと思います) が、適切な方法がわかりませんこのクラスには、子を必要な複合コレクションに「テンプレート化」する機能がないため、これを行います。

4

1 に答える 1

0

この平坦化されたリストをどのように使用していますか? 時々それを列挙する必要がありますか?次の点を考慮してください。

IEnumerable<Item> iterate(Item item)
{
     if (item == null)
          yield break;

     yield return item;

     foreach(Item i in item.Children)
     {
         foreach(Item ii in iterate(i){
            yield return ii;
         }
     }  
}

これにより、基本的に階層がフラットになり、すべてのアイテムをトラバースできるようになります。怠け者なので、常に外出先で評価されます。また、階層内の単一のアイテムに加えられた変更と一貫性があります (列挙と変更を同時に行わない限り)。

編集:

flattend コレクションはコレクションではなく、階層内のすべてのアイテムを含む一連のアイテムの表現です。つまり、特定の項目から子を追加 (または削除) すると、変更の前後で一貫した結果が得られます。

次の点を考慮してください。

アイテム item = buildItemHierarchy(); var flat = iterate(item); item.Children.RemoveAt(2); // 2 が存在すると仮定

flat は、ルートの 2 番目の子から発芽した枝を除いて、元のツリーのすべてのアイテムを「含む」ようになりました (再帰的に!)

于 2012-07-24T12:48:44.140 に答える