我想扩展DropDownList控件以包含用于创建或编辑选项的选项。例如;对于下拉列表中的项目列表,将有另一个选项显示“创建新项目...”或“编辑项目...”,这将是列表中的最后一个选项。当用户选择此选项时,selectedIndex或selectedItem将不会更改并将采取相应的操作(例如,弹出窗口显示)。这对最终用户来说是一种方便的方式。
现在我希望它独立于上下文而工作,并且该类必须是可重用的。用户只会指定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来监视数据提供者的长度属性,但是如果只有dataprovider中的对象发生了变化,它就无法工作。我需要捕获这些更改并更新视图。
我还需要捕获选择并调用optionFunction,防止默认操作不给索引越界错误。
提前致谢。
答案 0 :(得分:1)
只需将事件监听器添加到原始dataProvider即可。 IList
的所有实现都应在列表更改时调度CollectionEvent.COLLECTION_CHANGE
(例如,添加,删除或更改列表中的现有对象时)。在事件处理程序中,您可以相应地更新DropDownList的dataProvider。
通过覆盖mx_internal
方法setSelectedIndex()
,您可以根据自己的意愿调整选择。请查看博客文章“Disable selection on some items in a spark List”以获得一些灵感。