2009-04-29 76 views
7

好的我有一个ComboBox,dataProvider是一个带有标签属性的对象数组,这些对象为ComboBox提供了选项列表。Flex:有没有办法将ComboBox的selectedItem绑定到变量上?

有没有办法让我有一个像mySelectedItem这样的变量,并将ComboBox的selectedItem绑定到它,这样如果它发生变化,ComboBox的selectedItem会变成它是什么?

我希望这是有道理的。

谢谢!

回答

16

是的,ComboBox的selectedItem属性是可绑定的。

它会去是这样的:

<mx:ComboBox selectedItem="{mySelectedItem}"> 
</mx:ComboBox> 

在您的AS:

[Bindable] 
var mySelectedItem:Object; 

更改mySelectedItem应该在组合框显示。如果在ComboBox的dataProvider中不存在由mySelectedItem引用的项目,则可能会出错。

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 + " " + 
} 
9

从表面上看,它是那样简单:

<mx:ComboBox id="myComboBox" 
    dataProvider="{myDataProvider}" 
    selectedItem="{defaultItem}"/> 

当您设置defaultItem(确保它是[绑定])在数据提供者的项目之一,它会更新该控件。

但是这种方法存在问题。除非currentDefaultItem始终在myDataProvider之后更改,否则与dataProvider的绑定可能会撤消选择,恢复为默认值(列表中的第一项)。

解决此问题的一个方法是,通过在提供selectedItem的调用中包含dataProvider,强制selectedItem在dataProvider之后重新启动。

<mx:ComboBox id="myComboBox" 
    dataProvider="{myDataProvider}" 
    selectedItem="{getSelectedItem(myComboBox.dataProvider, defaultItem)}"/> 

这样做是为了确保当currentDefaultItem更改或dataProvider更改后,selectedItem会被反弹。我自己会对其他解决方案感兴趣。

1

我知道这是如何在文档中描述的。 由于对selectedItem的更改将触发更改侦听器。但对我而言,这并未发生。其他人遇到相同的行为?

+0

我用的selectedIndex注意到了这一点。 – Panzercrisis 2012-11-02 13:01:14

1

或者,你可以做这样的事情,如果你不介意延长组合框; 这是伪代码(对不起,匹配识别取决于对象类型) - 但你的想法...

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; 
    } 
} 
相关问题