如何将动态对象添加到 Flex 中的可绑定 ArrayCollection?

How to add dynamic objects to bindable ArrayCollection in Flex?

我有一个 ArrayCollection 作为 TabBar 的数据提供者。 添加的每个项目必须具有两个属性:labeldescription.

我动态定义这些项目如下:

[Bindable] //required to serve as data provider
private var mybar:ArrayCollection;

public function init() {
    mybar = new ArrayCollection();
    mybar.addItem({label: "Test1", description: "long test test"});
}


<s:TabBar dataProvider="{mybar}">
  <s:ItemRenderer>
    <s:ButtonBarButton label="{data.label}" /> //description might also be used here, but omitted
  </s:ItemRenderer>
</s:TabBar>

问题:由于属性"label"和"description"没有设置[Bindable],有如下错误日志:

warning: unable to bind to property 'label' on class 'Object' (class is not an IEventDispatcher)
warning: unable to bind to property 'description' on class 'Object' (class is not an IEventDispatcher)

我怎样才能避免这种情况?

如果我使用ObjectProxy警告消失:

mybar.addItem(new ObjectProxy( {label: "Test1", description: "long test test"}));

但这对吗?

消除警告的方法是使用具有可绑定属性的自定义 class。

[Bindable]
public class BarData
{
    public var label:String;
    public var description:String;
    public function BarData(label:String, description:String)
    {
        this.label = label;
        this.description = description;
    }
}

并以此来初始化它

public function init():void {
    mybar = new ArrayCollection();
    mybar.addItem(new BarData("Test1", "some description"));
    mybar.addItem(new BarData("Test2", "some description"));
}

如上所述的另一种方法将其包装在 ObjectProxy 中:

public function init():void {
    mybar = new ArrayCollection();
    mybar.addItem(new ObjectProxy({label:"Test1", description:"some description"}));
    mybar.addItem(new ObjectProxy({label:"Test2", description:"some description"}));
}

我很好奇您使用的是哪个 SDK,因为在我的 FlashBuilder 中,使用 SDK 4.7,您定义 TabBar 的方式导致了令人失望的结果。我必须这样做才能让它工作:

<s:TabBar dataProvider="{mybar}">
    <s:itemRenderer>
        <fx:Component>
            <s:ItemRenderer>
                <s:ButtonBarButton label="{data.label}" /> 
            </s:ItemRenderer>
        </fx:Component>
    </s:itemRenderer>
</s:TabBar>

这样定义它更容易:

<s:TabBar dataProvider="{mybar}" />

项目渲染器并没有真正在此处添加额外的功能,因此您可以这样做。

希望对您有所帮助。