Flex:有没有办法将ComboBox的selectedItem绑定到变量?

时间:2009-04-29 18:41:04

标签: flex

好的我有一个ComboBox,dataProvider是一个带有标签属性的对象数组,它为ComboBox提供了选项列表。

有没有办法可以像mySelectedItem一样使用变量,并将ComboBox的selectedItem绑定到它,这样如果它发生变化,ComboBox的selectedItem会变为它是什么?

我希望这是有道理的。

谢谢!

6 个答案:

答案 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