2011-03-27 103 views
0

我想擴展DropDownList控件以包含用於創建或編輯選項的選項。例如;對於下拉列表中的項目列表,會出現另一個選項「創建新項目...」或「編輯項目...」,這將是列表中的最後一個選項。當用戶選擇這個選項時,selectedIndex或selectedItem不會改變並且會採取相應的操作(例如彈出窗口出現)。這對於最終用戶來說是一個方便的途徑。擴展DropDownList以包含額外選項

現在我希望它獨立於上下文工作,並且類必須是可重用的。用戶只會指定optionText和optionFunction來解決這個問題。類的基本結構是這樣的:

public class OptiveDropDownList extends DropDownList 
{ 
    private var _enableOption:Boolean; 
    private var _optionText:String; 
    private var _originalDataProvider:IList; 
    [Bindable] public var optionFunction:Function; 

    public function OptiveDropDownList() 
    { 
     super(); 
    } 

    public function set optionText(value:String):void 
    { 
     _optionText = value; 
     dataProvider = _originalDataProvider; 
    } 

    public function set enableOption(value:Boolean):void 
    { 
     _enableOption = value; 
     dataProvider = _originalDataProvider; 
    } 

    public override function set dataProvider(value:IList):void 
    { 
     _originalDataProvider = value; 
     var dp:IList = null; 
     if(!value){ 
      dp=new ArrayCollection(value.toArray()); 
      if(_enableOption){ 
       var opt:Object=new Object(); 
       opt[labelField]=_optionText; 
       dp.addItem(opt); 
      } 
     } 
     super.dataProvider = dp; 
    } 

    [Bindable] 
    public override function get dataProvider():IList 
    { 
     return _originalDataProvider; 
    } 
} 

我希望我的代碼是清楚的瞭解,我加入了一個額外的對象給dataProvider的選項。字段名稱是不言自明的。

現在我的問題是如何知道數據提供者的項目是否已經改變?我應該覆蓋哪些功能以及如何去做。我曾嘗試使用ChangeWatcher來觀察數據提供者的長度屬性,但如果只有數據提供者中的某個對象發生了更改,它將無法正常工作。我需要捕獲這些更改並更新視圖。

我還需要捕獲選擇和調用optionFunction,防止默認操作不給索引超出界限的錯誤。

在此先感謝。

回答

1

只需將一個事件偵聽器添加到原始dataProvider即可。 IList的所有實現應在列表更改(例如添加,刪除或列表中的現有對象已更改時)時調度CollectionEvent.COLLECTION_CHANGE。在您的事件處理程序中,您可以相應地更新DropDownList的dataProvider。

通過重寫mx_internal方法setSelectedIndex()您可以根據自己的意願調整選擇。看看博客文章「Disable selection on some items in a spark List」獲取一些靈感。