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

时间:2015-06-03 13:44:04

标签: actionscript-3 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>

问题:作为属性&#34;标签&#34;和&#34;描述&#34;未设置[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"}));

但这是对的吗?

1 个答案:

答案 0 :(得分:2)

摆脱警告的方法是使用具有Bindable属性的自定义类。

[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}" />

项目渲染器并没有真正在这里添加额外的功能,所以你可以这样做。

希望这有帮助。

相关问题