2010-08-20 2 views
5

Я пытаюсь достичь dataField в DataGridColumn в itemRenderer. Ниже DataGrid:Flex 3: Как получить DataField DataGridColumn в свой ItemRenderer?

<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 Безразлично» t знать, какой день использовать, поскольку dataField неизвестен. Кто-нибудь знает, как достичь этого DataField в itemRenderer?

ответ

7

Комментарий по 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> 
+0

Ответ Creynders проще и работает тоже. –

3

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

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

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

Это не компилируется: "1120: Доступ неопределенной собственности ListData" , Это, вероятно, решение flex2, но я использую Flex3 –

+2

Как вы обнаружили, это не имеет никакого отношения к w/Flex 2. Многие классы уже реализуют интерфейс IDropInListItemRenderer. Не по теме; Вы должны подумать о повторной работе с вашим товаром, чтобы использовать меньше контейнеров. Почему бы просто не использовать ярлык? Вам действительно нужно добавить 2 контейнера? – JeffryHouser

+0

На самом деле это всего лишь часть всего рендеринга, в моем фактическом коде действительно нужны контейнеры.Но вы правы, пример, использованный здесь, может быть меньше. –

2

Вы не должны осуществлять IDropInListItemRenderer. Этого достаточно:

data[ (listData as DataGridListData).dataField ] 

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

+0

Я сделал свой контроль более общим и добавил проверку типа: 'if (listData - DataGridListData) {...}' –

0

следующие работы искры на основе визуализации элементов в 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> 
0

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

  • advancedDataGridListData в MXAdvancedDataGridItemRenderers
  • dataGridListData в MXDataGridItemRenderer

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

0

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

column.dataField 

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

<s:Label text="{data[column.dataField]}" /> 
Смежные вопросы