Flex 3: как получить dataField DataGridColumn в его ItemRenderer? - PullRequest
5 голосов
/ 20 августа 2010

Я пытаюсь добраться до поля данных DataGridColumn в itemRenderer.Ниже находится 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 я получаю целую неделю (что нормально), ноitemRenderer не знает, какой день использовать, потому что dataField неизвестен.Кто-нибудь знает, как добраться до этого поля данных в itemRenderer?

Ответы [ 6 ]

7 голосов
/ 20 августа 2010

Комментарий 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>
3 голосов
/ 20 августа 2010

Используйте класс DataGridListData , который передается в средство визуализации.Он содержит свойство dataField.

Я почти уверен, что это должно работать:

<mx:Label text="{data[listData.dataField]}" /> 
2 голосов
/ 05 октября 2010

Вам не нужно реализовывать IDropInListItemRenderer.Этого достаточно:

data[ ( listData as DataGridListData ).dataField ]

Конкретный listData имеет тип DataGridListData, но само свойство имеет тип BaseListData, поскольку средство визуализации может использоваться в различных сценариях.Однако в этом сценарии мы знаем, что это DataGridListData, поэтому мы можем просто привести его к свойству dataField.

0 голосов
/ 13 апреля 2015

Для среднего GridItemRenderer это

column.dataField

Итак, в вашем случае это должно работать:

<s:Label text="{data[column.dataField]}" />
0 голосов
/ 03 февраля 2012

Еще проще: просто используйте свойства

  • advancedDataGridListData в MXAdvancedDataGridItemRenderers
  • dataGridListData в MXDataGridItemRenderer

    для доступа к этой информации.

0 голосов
/ 29 декабря 2011

Для средства визуализации элементов на основе Spark в MX AdvancedDataGrid работает:

<?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>
...