[英]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
参数来修改查找值的方式。
对于combo.selectedItem
到model.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数据源。 但是,实际上,您根本不需要指定它,因为label
是labelField
属性的默认值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.