Flex:如何向DropDownList的dataProvider传递GridItemRenderer?

时间:2011-10-26 19:18:39

标签: flex datagrid drop-down-menu itemrenderer dataprovider

我需要在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”时,应用程序将启动,但当然下拉列表中没有数据。

有什么想法吗?谢谢!

1 个答案:

答案 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和/或测量。