基于源更新刷新HiearachicalData?

时间:2011-04-04 15:27:01

标签: flex actionscript collections hierarchical-data arraycollection

我有ArrayCollection我们称之为“项目”。它本质上是一个分层数据的扁平集合(每个项目都有ParentChildren属性)。我希望AdvancedDataGrid以分层形式显示数据,所以基本上我可以这样做,它会显示正常:

// Note: RootItems would be an ArrayCollection that is updated so only the
// top level items are within (item.Parent == null).
var hd:HierarchicalData = new HierarchicalData(model.RootItems);
var hcv:HierarchicalCollectionView = new HierarchicalCollectionView(hd);

myDataGrid.dataProvider = hdc;

这样做有效,但我希望能够在更新myDataGrid集合时查看Items中的更新(因为RootItems无法获取任何子级的更新,只有顶级任务)。有没有简单的方法来做到这一点?我猜我必须创建一个扩展HierarchicalData的类,并在Items更改时以某种方式提醒它,但这听起来很慢。提前感谢您提供的任何帮助!

1 个答案:

答案 0 :(得分:2)

您有两种方法可以解决此问题。您可以创建自己的IHierarchicalData实现(它不必扩展HierarchicalData,在这种特殊情况下,您可以重用的代码不多)或者您改变处理数据的方式一点点,以便它符合标准用例:

[Bindable] // make it bindable so that the HierarchicalCollectionView gets notified when the object changes
class Foo // your data class
{
    // this constructor is needed to easily create the rootItems below
    public function Foo(children:ArrayCollection = null)
    {
        this.children = children;
    }

    // use an ArrayCollection which dispatches an event if one of its children changes
    public var children:ArrayCollection;

    // all your other fields
}

// Create your rootItems like this. Each object can contain a collection of children
// where each of those can contain children of its own and so forth...
var rootItems:ArrayCollection = new ArrayCollection([
    new Foo(
        new ArrayCollection([
            new Foo(),
            new Foo(),
            new Foo(
                new ArrayCollection([
                    // ...
                ]),
            new Foo()
        ])
    ),
    new Foo(
        // ...
    ),
    // ...
]);

// Create the HierarchicalData and HierachicalCollectionView
var hd:IHierarchicalData = new HierarchicalData(rootItems);

[Bindable]
var hcv:IHierarchicalCollectionView = new HierarchicalCollectionView(hd);

然后,您可以在ADG中使用hcv作为dataProvider,并使用其方法添加和删除项目。每当您添加,删除或更新项目时,ADG都会刷新。

我建议你采用标准方式,除非这是不可能的。