0

我有一个可观察集合的层次结构,有点像这样:

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

给定一个IItem(或一个ObservableCollection<IItem>),我想构建一个其他可观察的集合,该集合递归地包含所有子IItem项。然后,此集合将用作 WPF 列表视图的数据源(例如)。

修改这些项目中的任何一个以具有其他子项应该更新生成的 observable 集合。请注意,没有循环引用。

我知道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 集合根本不是集合,它是包含层次结构中所有项目的项目序列的表示。这意味着如果您从某个项目中添加(或删除)子项,您将在更改前后获得一致的结果。

考虑以下:

项目项目 = buildItemHierarchy(); 变平=迭代(项目);item.Children.RemoveAt(2); // 假设 2 存在

flat 现在“包含”原始树中的所有项目,没有从根的第二个孩子发芽的分支(递归!)

于 2012-07-24T12:48:44.140 回答