0

我正在创建一个开源应用程序来管理我所在县的环境资源。

我在数据网格上使用的 itemrenderer(组合框)的数据提供程序有问题。该应用程序可以工作,但我收到一条警告,说 itemrenderer 数据提供程序不会在使用 setter 更新时重新分配数据。即使我不需要重新分配组合框 itemrenderer 数据提供者,作为最佳实践我想解决这个警告。

这是我用来获取 dataprovider 数据的常用代码,它是从 itemrenderer 的 parentDocument 中的 Web 服务结果填充的数组集合:

    //为组合框itemrenderer设置农民arrayCollection值
    [可绑定]
    私人 var _acFarmers:ArrayCollection=new ArrayCollection;
    公共函数集 acFarmers(acFarmers:ArrayCollection):void{
        _acFarmers=acFarmers;

    }
    //获取机器ArrayCollection值
    公共函数获取 acFarmers():ArrayCollection{
        返回_acFarmers;
    }

这是 datagrid itemrenderer 的代码(仅显示 datagrid 感兴趣的列):

<mx:DataGridColumn headerText="Agricoltore" dataField="farmerId" width="200" rendererIsEditor="true" editable="false">

            <mx:itemRenderer>

                <fx:Component id="cmpCmbFarmers">

                        <mx:HBox>

                        <s:ComboBox width="200" 
                                    id="cmbFarmers"
                                    dataProvider="{outerDocument.acFarmers}" 
                                    labelField="companyName" 
                                    change="onSelectionChange(event)"

                                    >
                            <fx:Script>
                                <![CDATA[
                                    import mx.controls.dataGridClasses.DataGridListData;
                                    import mx.controls.listClasses.BaseListData;
                                    import mx.events.ListEvent;

                                    private var _ownerData:Object;

                                    private function setSelected():void {

                                    }

                                    override public function set data(value:Object):void{
                                        if(value != null)  {
                                            super.data=value;
                                            _ownerData=value;

                                            if(value.collectingMachineId!==null){
                                                for each(var dp:Object in cmbFarmers.dataProvider){
                                                    var dpFarmerId:String=dp.farmerId
                                                    var dataFarmerId:String=value.farmerId;
                                                    if(dpFarmerId==dataFarmerId){
                                                        cmbFarmers.selectedItem=dp;
                                                    }
                                                }
                                            } else {
                                                cmbFarmers.selectedIndex=0;
                                                data.farmerId=cmbFarmers.selectedItem.farmerId;
                                            }
                                        }
                                    }


                                    import spark.events.IndexChangeEvent;

                                    protected function onSelectionChange(event:IndexChangeEvent):void
                                    {

                                        data.farmerId=cmbFarmers.selectedItem.farmerId;
                                    }     



                                ]]>
                            </fx:Script>
                            </s:ComboBox>

                        </mx:HBox>


            </fx:Component> 
            </mx:itemRenderer>

            </mx:DataGridColumn>

如果我在调用 datagrid 数据服务并在服务响应时设置 datagrid arraycollection 之前调用 itemrenderer 服务以获取组合框数据,则此代码有效。

但是会显示一条警告,因为组合框数据提供者在对其数据提供者 (_acFarmers) 设置函数后不会得到更改。

这是我对整个项目的唯一警告,但我没有设法解决它。

我真的很感激任何帮助。

谢谢

保罗

4

2 回答 2

0

您必须将[Bindable]metatag 放在 setter 而不是 above 之上_acFarmers。因为现在您的acFarmers财产不是数据绑定的来源。

或者更好地使用公共变量而不是 getter 和 setter,因为您没有在其中实现其他操作。

关于数据绑定的链接

于 2012-06-04T05:33:04.140 回答
0

尝试使用 dataChangeEvent 您可以将 dataChange 事件与项目渲染器或项目编辑器一起使用。每次数据属性更改时,Flex 都会调度 dataChange 事件。

<mx:ItemRenderer dataChange="someFunction()">

或者

dataToDisplay.addEventListener( FlexEvent.DATA_CHANGE, dataChange );
于 2012-06-16T13:25:39.357 回答