2015-06-19 98 views
1

我有我想作爲數據輸入綁定的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}" /> 

現在,在選擇項目時,綁定應該objext的相關index屬性發送到模型和更新labelIndex。 當然,它不能像上面那樣工作,因爲labelIndexArrayCollection的數據類型不同。

[Bindable] 
private var model:MyModel; 

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

問題:如何將數組元素映射到模型,反之亦然?

回答

2

你正在尋找的東西需要一些腳本,綁定不夠聰明來弄清楚如何處理它自己。

您可以使用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屬性,並傳遞物品index屬性的值。

周圍的另一種方法是多一點棘手,將需要使用的吸氣劑功能,其抓住從數據源對象,基於所述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}" /> 

注意,沒有必要:l,在labelField財產@,這只是與你需要的XML數據源使用定位一個屬性。但是,實際上你根本不需要指定,因爲labellabelField屬性的默認值。

+0

但是如果'索引'不是一個序列,就像'1,2,5,17'一樣?你的代碼仍然可以用嗎? – membersound

+0

@membersound我誤解了你的問題,請看我最新的答案。 –

+0

感謝您的更新。無論如何,這是真正複雜的代碼,只是獲得一個簡單的數據饋入複選框。我的意思是,UI框架通常要求某種數據對象作爲複選框的數據源,其中選擇應該只顯示對象的部分屬性,並且模型的鏈接也應該使用部分屬性(在我的情況:一個元素的索引,它將被保存到數據庫中,以便用戶設置可以在登錄時被恢復)。有沒有更簡單的方法來做到這一點? – membersound