【问题标题】:Flex: How can I pass a GridItemRenderer the DropDownList's dataProvider?Flex:如何将 GridItemRenderer 传递给 DropDownList 的 dataProvider?
【发布时间】:2011-12-16 00:02:04
【问题描述】:

我需要在我的 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%"/>

传递给渲染器 (AudActionData) 的 IList 被转换为过滤后的 ArrayCollection,该 ArrayCollection 将用作下拉列表的 dataProvider。

我有几个问题。

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

有什么想法吗?谢谢!

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-10
      • 1970-01-01
      • 2012-11-04
      • 1970-01-01
      • 2010-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多