2011-03-27 105 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”获取一些灵感。