繁体   English   中英

flex ComboBox的双向绑定?

[英]Bidirectional binding for flex ComboBox?

我有一个要绑定为ComboBox数据输入的集合:

private static var LOGOS:ArrayCollection = new ArrayCollection([
 {index:0, label=logo1}, 
 {index:1, label=logo2}
]);

<s:ComboBox selectedItem="@{model.labelIndex}" labelField="@label" dataProvider="{LOGOS}" />

现在,当选择一个项目时,绑定应将labelIndex的关联index属性发送到模型并更新labelIndex 当然,它不能如上所述工作,因为labelIndex的数据类型与ArrayCollection数据类型不同。

[Bindable]
private var model:MyModel;

[Bindable]
class MyModel {
   public var:Number labelIndex;
}

问题:如何将数组元素映射到模型,反之亦然?

您要查找的内容将需要一些脚本,绑定不够聪明,无法弄清楚如何自行处理。

您可以使用BindingUtils类来定义绑定,并使用bindProperty方法的chain参数来修改查找值的方式。

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/mx/binding/utils/BindingUtils.html

对于combo.selectedItemmodel.labelIndex绑定,您可以将链指定为数组,其中元素定义查找值的路径:

BindingUtils.bindProperty(model, 'labelIndex', combo, ['selectedItem', 'index']);

这将绑定到selectedItem属性,并传递items index属性的值。

另一种方法则比较棘手,将需要使用getter函数,该函数根据labelIndex值从数据源中获取对象:

BindingUtils.bindProperty(combo, 'selectedItem', model, {
    name: 'labelIndex',
    getter: function(host:MyModel):Object
    {
        return LOGOS.source.filter(function(item:Object, index:int, array:Array):Boolean
        {
            return item.index === host.labelIndex;
        })[0];
    }
});

这将绑定到labelIndex属性,并且在属性更改时将调用getter函数。 该函数将根据模型更改后的labelIndex属性值过滤数据源,并返回具有匹配index属性值的源对象,该属性最终将为组合框selectedItem属性设置。

您的组合框定义当然需要一个id才能通过脚本进行定位

<s:ComboBox id="combo" dataProvider="{LOGOS}" />

请注意,在labelField属性中不需要@ ,它仅用于需要定位属性的XML数据源。 但是,实际上,您根本不需要指定它,因为labellabelField属性的默认值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM