Flex: Как я могу передать GridItemRenderer поставщику данных DropDownList? - PullRequest
1 голос
/ 26 октября 2011

Мне нужно отобразить DropDownLists в столбце DataGrid в моем приложении Flex. Вот что я делаю:

Во-первых, у меня есть функция средства визуализации элементов, которая создает настраиваемое средство визуализации элементов и передает ему свойство, которое представляет собой IList, который будет использоваться в качестве dataProvider для dropDownList:

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 для раскрывающегося списка.

У меня есть пара проблем с этим.

Во-первых, как я могу вызвать функцию init при создании рендерера? Во-вторых, когда я устанавливаю столбец itemRendererFunction = "rendererFunction", приложение не запускается, появляется белый экран. Но когда я устанавливаю itemRenderer = "components.AudActionDropDownIR", приложение запускается, но, конечно, в раскрывающемся списке нет данных.

Есть идеи? Спасибо!

1 Ответ

0 голосов
/ 27 октября 2011

Во-первых, вы можете сделать это, создав метод 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 показывают предпочтение для использования привязки данных для этого, и причина в том, что если у вас нет веской причины производительности для написания кода, показанного выше, это намного проще. Обратите внимание, что для некоторых обновлений вам может понадобиться переопределить updateDisplayList и / или измерять.

...