2011-03-14 57 views
0

我有兩個關於Flex組合框的問題。Flex combo box labelfunction

  1. 表示函數名稱的字符串將從xml @運行時讀取。

    var combo:ComboBox = new ComboBox(); combo.labelFunction =「functionName」;

我該如何做到這一點?

  1. 因此,要顯示在組合框中的名字只能通過訪問另一個DTO(稱爲person,然後是其名)來檢索。

    var combo:ComboBox = new ComboBox(); combo.labelField =「person.firstName」;

我的類看起來是這樣的,

public class Test 
{ 
    public var person:PersonDTO; 
} 

public class PersonDTO 
{ 
    public var firstName:String; 
} 

是否有可能訪問使用組合框的標籤字段中的任何多級文本?

回答

0

廣告1)的labelFunction

調用函數時,你只知道名稱作爲字符串是很容易的。以下片段顯示瞭如何執行一個屬於同一類的成員的函數。如果您需要調用另一個類的函數,請使用相應的變量名替換this

private function comboBox_labelFunction(item:Object):String 
{ 
    var functionName:String = [email protected]; 
    return this[functionName](item); 
} 

廣告2)的labelField

它通常無法使用 「person.firstName」 作爲labelField屬性。不過,你應該可以在你的labelFunction中使用它。像這樣的東西應該工作...

private function comboBox_labelFunction(item:Object):String 
{ 
    var labelField:String = "person.firstName"; 
    var attributeNames:Array = labelField.split("."); 

    for each (var attributeName:String in attributeNames) 
    { 
     if (item && item.hasOwnProperty(attributeName)) 
      item = item[attributeName]; 
     else 
      return null; 
    } 

    return item; 
} 
2

您需要傳遞函數而不是名稱。 這樣做

combo.labelFunction = "functionName"; 

傳遞一個字符串。

我能想到的唯一工作就是爲每個可能具有的功能做一個switch語句。然後用你的xml中的「case」來調用它。

switch([email protected]){ 
    case 'func1': 
     combo.labelFunction = this.func1; 
     break; 
    case 'func2': 
     combo.labelFunction = this.func2; 
     break; 
} 

它的hacky,但應該工作。