【问题标题】:Flex 3: How do I get the DataGridColumn's dataField in its ItemRenderer?Flex 3:如何在其 ItemRenderer 中获取 DataGridColumn 的 dataField?
【发布时间】:2011-04-01 14:38:54
【问题描述】:

我正在尝试访问 itemRenderer 中 DataGridColumn 的数据字段。下面是dataGrid:

<mx:Script>
    <![CDATA[
        [Bindable] public var weeksOfMoth:ArrayCollection = new ArrayCollection([
                {monday:30, tuesday:31, wednesday:1, thursday:2, friday:3, saturday:4, sunday:5},
                {monday:6, tuesday:7, wednesday:8, thursday:9, friday:10, saturday:11, sunday:12},
                {monday:13, tuesday:14, wednesday:15, thursday:16, friday:17, saturday:18, sunday:19}, 
                {monday:20, tuesday:21, wednesday:22, thursday:23, friday:24, saturday:25, sunday:26}, 
                {monday:27, tuesday:28, wednesday:29, thursday:30, friday:1, saturday:2, sunday:3}
            ]);
    ]]>
</mx:Script>
<mx:DataGrid dataProvider="{weeksOfMoth}" >
    <mx:columns>
        <mx:DataGridColumn itemRenderer="view.DateRenderer" dataField="monday" />
        <mx:DataGridColumn itemRenderer="view.DateRenderer" dataField="tuesday" />
        <mx:DataGridColumn itemRenderer="view.DateRenderer" dataField="wednesday" />
        <mx:DataGridColumn itemRenderer="view.DateRenderer" dataField="thursday" />
        <mx:DataGridColumn itemRenderer="view.DateRenderer" dataField="friday" />
        <mx:DataGridColumn itemRenderer="view.DateRenderer" dataField="saturday" />
        <mx:DataGridColumn itemRenderer="view.DateRenderer" dataField="sunday" />
    </mx:columns>
</mx:DataGrid>

这是我的 ItemRenderer:

<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" >
    <mx:Box >

                    <!-- How do I get the dataField here?? -->
        <mx:Label text="{data[dataField]}" /> 
    </mx:Box>
</mx:Canvas>

在itemRenderer的set data函数中,我收到了一整周(可以),但是itemRenderer不知道使用哪一天,因为dataField是未知的。有谁知道如何在 itemRenderer 中访问这个 dataField?

【问题讨论】:

    标签: apache-flex datagrid flex3 itemrenderer datafield


    【解决方案1】:

    www.Flextras.com 的评论帮助我找到了解决方案。我确实可以使用listData.dataField,但首先需要实现IDropInListItemRenderer 类。

    最后的ItemRenderer

    <?xml version="1.0" encoding="utf-8"?>
    <mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" implements="mx.controls.listClasses.IDropInListItemRenderer" >
        <mx:Script>
            <![CDATA[
                import mx.controls.dataGridClasses.DataGridListData;
                import mx.controls.listClasses.BaseListData;
    
    
                // Internal variable for the property value.
                private var _listData:DataGridListData;
    
                // Make the listData property bindable.
                [Bindable("dataChange")]
    
                // Define the getter method.
                public function get listData():BaseListData
                {
                  return _listData;
                }
    
                // Define the setter method,
                public function set listData(value:BaseListData):void
                {
                  _listData = DataGridListData(value);
                }
    
            ]]>
        </mx:Script>
        <mx:Box width="80%" height="80%" verticalCenter="0" horizontalCenter="0" backgroundColor="#FFFFFF">
            <mx:Label text="{data[_listData.dataField]}" />
        </mx:Box>
    </mx:Canvas>
    

    【讨论】:

      【解决方案2】:

      对于一个普通的 GridItemRenderer,它是一个

      column.dataField
      

      所以,在你的情况下,这应该可行:

      <s:Label text="{data[column.dataField]}" />
      

      【讨论】:

        【解决方案3】:

        更简单: 只需使用属性

        • advancedDataGridListData 在 MXAdvancedDataGridItemRenderers 中

        • dataGridListDatain MXDataGridItemRenderer

          访问该信息。

        【讨论】:

          【解决方案4】:

          以下内容适用于 MX AdvancedDataGrid 中基于 Spark 的项目渲染器:

          <?xml version="1.0" encoding="utf-8"?>
          <s:MXAdvancedDataGridItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" 
                                            xmlns:s="library://ns.adobe.com/flex/spark" 
                                            xmlns:mx="library://ns.adobe.com/flex/mx"
                                            width="100%"
                                            >
              <fx:Declarations>
                  <!-- Place non-visual elements (e.g., services, value objects) here -->
              </fx:Declarations>
              <fx:Script>
                  <![CDATA[               
                      import mx.controls.dataGridClasses.DataGridListData;
          
                      override public function set data( value:Object):void {             
                          var latency:Number = value[ ( this.listData as DataGridListData).dataField] as Number;
          
                          lbl.text = Utils.formatLatency( latency);
                          if( latency > 1000000) { // 1s => error
                              lbl.setStyle( "backgroundColor", 0xFF8080);
                          } else if( latency > 100000) { // 100ms => warning
                              lbl.setStyle( "backgroundColor", 0xFFFF80);
                          } else if( latency > 0){ // low latency
                              lbl.setStyle( "backgroundColor", 0x80FF80);
                          }
                      }
                  ]]>
              </fx:Script>
              <s:Label id="lbl" width="100%" height="100%" verticalAlign="middle" textAlign="right" paddingRight="5"/>
          </s:MXAdvancedDataGridItemRenderer>
          

          【讨论】:

            【解决方案5】:

            您不必实现 IDropInListItemRenderer。 这就够了:

            data[ ( listData as DataGridListData ).dataField ]
            

            具体的 listData 是 DataGridListData 类型,但是属性本身是 BaseListData 类型的,因为可以在各种场景中使用渲染器。但是,在这种情况下,我们知道它是 DataGridListData,因此我们可以简单地将其转换为访问 dataField 属性。

            【讨论】:

            • 我使我的控件更通用,并添加了类型检查:if (listData is DataGridListData) { ... }
            【解决方案6】:

            使用DataGridListData 类,它被传递到渲染器中。它包含一个 dataField 属性。

            我很确定这应该可行:

            <mx:Label text="{data[listData.dataField]}" /> 
            

            【讨论】:

            • 这不会编译:“1120:未定义属性 listData 的访问”。可能是flex2解决方案,但我用的是flex3
            • 如您所见,这与 Flex 2 无关。许多类已经实现了 IDropInListItemRenderer 接口。无关;您应该考虑重新设计 itemRenderer 以使用更少的容器。为什么不只使用标签?你真的需要额外的 2 个容器吗?
            • 它实际上只是整个渲染器的一部分,在我的实际代码中它确实需要容器。但你是对的,这里使用的示例可以更小。
            • 我很高兴你解决了。如果您认为我的回答帮助您解决了问题,请随时表达一些爱意并给我的回答投票。 ;)
            猜你喜欢
            • 1970-01-01
            • 2011-04-30
            • 1970-01-01
            • 2010-12-21
            • 2013-03-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-09-25
            相关资源
            最近更新 更多