繁体   English   中英

Flex:如何将GridItemRenderer传递给DropDownList的dataProvider?

[英]Flex: How can I pass a GridItemRenderer the DropDownList's dataProvider?

我需要在Flex应用程序的DataGrid列中显示DropDownLists。 这是我在做什么:

首先,我有一个项目渲染器函数,该函数创建一个自定义项目渲染器,并向其传递一个IList属性,该属性将用作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,它将用作下拉列表的dataProvider。

我对此有几个问题。

首先,创建渲染器后如何调用init函数? 其次,当我设置列的itemRendererFunction =“ rendererFunction”时,该应用将无法启动,出现白屏。 但是,当我设置itemRenderer =“ components.AudActionDropDownIR”时,该应用程序将启动,但是下拉列表中当然没有数据。

有任何想法吗? 谢谢!

首先,您可以通过创建一个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和/或度量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM