好的我有一个ComboBox,dataProvider是一个带有标签属性的对象数组,它为ComboBox提供了选项列表。
有没有办法可以像mySelectedItem一样使用变量,并将ComboBox的selectedItem绑定到它,这样如果它发生变化,ComboBox的selectedItem会变为它是什么?
我希望这是有道理的。
谢谢!
答案 0 :(得分:16)
是的,ComboBox的selectedItem属性是可绑定的。
它会是这样的:
<mx:ComboBox selectedItem="{mySelectedItem}">
</mx:ComboBox>
在您的AS中:
[Bindable]
var mySelectedItem:Object;
对mySelectedItem的更改应显示在ComboBox中。如果mybolectedItem引用的项目在ComboBox的dataProvider中不存在,则可能会出错。
答案 1 :(得分:9)
从表面上看,它很简单:
<mx:ComboBox id="myComboBox"
dataProvider="{myDataProvider}"
selectedItem="{defaultItem}"/>
当您将defaultItem(确保它是[Bindable])设置为数据提供程序中的某个项目时,它将更新控件。
但这种方法存在问题。除非currentDefaultItem始终在myDataProvider之后更改,否则绑定到dataProvider可能会撤消选择,恢复为默认值(列表中的第一项)。
解决这个问题的一种方法是通过在提供selectedItem的调用中包含dataProvider来强制selectedItem在dataProvider之后反弹。
<mx:ComboBox id="myComboBox"
dataProvider="{myDataProvider}"
selectedItem="{getSelectedItem(myComboBox.dataProvider, defaultItem)}"/>
这样做确保当currentDefaultItem更改时或者dataProvider更改后,selectedItem将被反弹。我自己也对其他解决方案感兴趣。
答案 2 :(得分:2)
为Change
事件使用事件监听器并在那里进行处理。
// update a label item's text with that of the Combobox's selectedItem
private function changeEvt(event:Event):void {
label.text =event.currentTarget.selectedItem.label + " " +
}
答案 3 :(得分:1)
我知道这是文档中描述的内容。 在更改selectedItem时将触发更改侦听器。但对我来说,这不会发生。其他人遇到同样的行为吗?
答案 4 :(得分:1)
或者,如果你不介意扩展ComboBox,你可以做这样的事情; 这是伪代码(对不起,匹配的识别取决于对象类型) - 但你明白了......
public class IndexRetainingComboBox extends ComboBox
{
public function IndexRetainingComboBox()
{
super();
}
override public function set dataProvider(value:Object):void
{
var originalSelection:Object = this.selectedItem;
super.dataProvider = value;
var newIdx:uint = [find originalSelection idx in combobox or return 0 ]
this.selectedIndex = newIdx;
}
}
答案 5 :(得分:0)
这看起来是一个很好的方法:使value属性可写: http://flex.sys-con.com/node/312098