我需要在Flex应用程序的DataGrid列中显示DropDownLists。这就是我在做的事情:
首先,我有一个项呈示器函数,它创建一个自定义项呈示器,并向它传递一个属性,该属性将用作dropDownList的dataProvider:
private function rendererFunction(item:Object):ClassFactory {
var itemRenderer:ClassFactory = new ClassFactory(AudActionDropDownIR);
itemRenderer.properties = {AudActionData: AudActionData};
return itemRenderer;
}
这是自定义项呈示器类的代码:
<fx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
import mx.collections.IList;
[Bindable]
public var TheData:ArrayCollection = new ArrayCollection();
public var AudActionData:IList;
public function init():void
{
TheData = new ArrayCollection(AudActionData.toArray());
TheData.filterFunction = filterTheData;
TheData.refresh();
}
private function filterTheData(item:Object):Boolean {
return item.AUD_STEP_TYPE_ID == data.AUD_STEP_TYPE_ID;
}
]]>
</fx:Script>
<s:DropDownList id="theList"
labelField="AUD_ACTION_DESCR"
requireSelection="true"
selectedIndex="0"
dataProvider="{TheData}"
width="100%"/>
传递给渲染器的IList(AudActionData)将转换为过滤后的ArrayCollection,该ArrayCollection将用作下拉列表的dataProvider。
我遇到了一些问题。
首先,如何在创建渲染器时调用init函数? 其次,当我设置列的itemRendererFunction =“rendererFunction”时,应用程序将无法启动,出现白屏。但是当我设置itemRenderer =“components.AudActionDropDownIR”时,应用程序将启动,但当然下拉列表中没有数据。
有什么想法吗?谢谢!
答案 0 :(得分:0)
首先,您可以通过创建init方法并在渲染器的creationComplete中调用它来完成此操作。但除非你从未计划使用虚拟化,否则我不会建议它。我说这个的原因是因为当用户滚动时数据发生变化时,你不会看到任何更新,这会使它看起来像是在DataGrid的行上显示随机的旧数据。
相反,做这样的事情:
private var _data:*;
private var _dataChanged:Boolean;
override public function get data():*{
return _data;
}
override public function set data(value:*):void {
if (value != _data) {
_data = value;
super.data=value;
_dataChanged=true;
invalidateProperties();
}
}
override protected function commitProperties():void {
super.commitProperties();
if (_dataChanged) {
//this is just example code of how you'd update your own subcomponents
someLabel.text = _data['property'];
//more updating
}
}
您可能已经注意到,Adobe示例显示了对此使用数据绑定的偏好,原因是如果您没有强大的性能原因来编写上面显示的代码类型,那么它就是&#39 ;更容易。请注意,对于某些更新,您可能还需要覆盖updateDisplayList和/或测量。