Flex: как я могу передать GridItemRenderer в dataProvider выпадающего списка?

#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 .