#apache-flex #datagrid #drop-down-menu #itemrenderer #dataprovider
#apache-flex #datagrid #выпадающее меню #itemrenderer #dataprovider
Вопрос:
Мне нужно отобразить выпадающие списки в столбце DataGrid в моем приложении Flex. Вот что я делаю:
Во-первых, у меня есть функция визуализации элементов, которая создает пользовательский средство визуализации элементов и передает ему свойство IList, которое будет использоваться в качестве источника данных выпадающего списка:
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, который будет использоваться в качестве dataProvider для выпадающего списка.
У меня возникла пара проблем с этим.
Во-первых, как я могу вызвать функцию инициализации при создании средства визуализации? Во-вторых, когда я устанавливаю itemRendererFunction столбца=»rendererFunction», приложение не запускается, появляется белый экран. Но когда я устанавливаю ItemRenderer=»компоненты.AudActionDropDownIR», приложение запустится, но, конечно, в выпадающем списке нет данных.
Есть идеи? Спасибо!
Ответ №1:
Во-первых, вы можете сделать это, создав метод инициализации и вызвав его в 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 предпочтение отдается использованию привязки данных для этого, и причина в том, что если у вас нет веских оснований для написания кода, показанного выше, это намного проще. Обратите внимание, что для некоторых обновлений вам может потребоваться также переопределить updateDisplayList и / или measure .