【问题标题】:Flex data binding object converted to ArrayCollectionFlex 数据绑定对象转换为 ArrayCollection
【发布时间】:2011-09-21 15:41:45
【问题描述】:

我有一个有点复杂的父/子层次结构对象,我需要以动态更新的树格式显示它。为了将它作为数据提供者传递到树中,我将*父级转换为数组,然后转换为 ArrayCollection。问题是如果层次结构发生任何变化,除非我重新生成数据提供程序,否则树不会动态更新。

编辑:我没有显示太多代码,所以我只是尝试在下面包含所有内容的骨架版本,树工作正常,即使我删除/添加节点,更改也很明显,但垂直滚动bar 未更新(不调整大小),如果我滚动树将失控,并可能在刚刚删除项目的树底部显示空白。

我只尝试了一个具有多个级别的普通可绑定 ArrayCollection 测试对象,它可以正确更新,所以我认为我的树很好,这正是我尝试绑定遇到问题的数据提供者的方式。

AS3 Class 1 - 通过调用 insertCustomObject() 可以拥有大量自身子对象的对象

public function CustomObject() {

}
public function insertCustomObject(customObject : CustomObject) : void {
    customObject.parent = this;
}

AS3 Class 2 - 包含一个 CustomObject,它将有很多孩子,这就是我想要显示为树的内容。

public class CustomContainer {
    private var _root : CustomObject;

    public function rootAsCollection() : ArrayCollection {
        return new ArrayCollection(new Array(_root));
    }
}

MXML 组件 1 - 包含自定义树组件并将其传递 customObjects 以用作数据提供者

[Bindable]
private var customContainer : CustomContainer;

<component:TreeCustom id="treeCustom" width="100%" customObjects="{customContainer.rootAsCollection()}"/>

MXML 组件 2 - 树本身,从 MXML 组件 1 中获取 customObjects 参数来设置它的数据提供者。

[Bindable]
private var _customObjects : ArrayCollection;

public function set customObjects(objects : ArrayCollection) : void {
    _customObjects = objects;
}

<mx:Tree id="customTree" dataProvider="{_customObjects}" />

【问题讨论】:

  • 您是否尝试过使用HierarchicalData 而不是ArrayCollection?在不了解您的数据结构是什么样子的情况下,这是我目前最好的建议。

标签: apache-flex actionscript-3


【解决方案1】:

当您在树中提供子项列表时,您应该使用ArrayCollection 而不是数组。 Array 不会在元素被添加或移除时调度更改事件,并且 Tree 无法相应地更新。

这是一个可以让用户组成数据层次结构的类示例:

public class Person extends EventDispatched
{

    public function Person(name:String, children:ArrayCollection)
    {
        super();

        this.name = name;
        this.children = children;
    }

    [Bindable]
    public var name:String;

    [Bindable]
    public var children:ArrayCollection;

}

【讨论】:

  • 我使用的是 ArrayCollection,我只是先转换为 Array,然后再将其传递给 ArrayCollection。我认为我的问题源于我必须将我的对象转换为树可用的格式(而不仅仅是能够按原样传递 Bindable 对象),因此对实际对象的任何更改都不会被完全检测到树。