将可观察集合的层次结构展平为单个可观察集合

时间:2012-07-24 12:05:57

标签: c# wpf observablecollection compositecollection

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

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

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

修改任何这些项目以包含其他子项应更新生成的可观察集合。请注意,没有循环引用。

我知道CompositeCollection Class并且我确信这应该对我有用(我认为我需要的是一个复合集合递归地包含Children中每个孩子的复合集合) ,但是我看不到这样做的简洁方法,因为这个类没有能力将子模板“模板化”到所需的复合集合中。

1 个答案:

答案 0 :(得分: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 item = buildItemHierarchy(); var flat = iterate(item); item.Children.RemoveAt(2); //假设2存在

flat now'包含'来自原始树的所有项目,没有从根的第二个子节点突然出现的分支(递归!)