2008-09-21 2 views
0

Я использую виджет AdvancedDataGrid, и я хочу, чтобы два столбца были переключателями, где каждый столбец является собственной RadioButtonGroup. Я думал, что у меня есть все необходимые mxxml, но я столкнулся с проблемой странного поведения. Когда я прокручиваю вверх и вниз, кнопка меняет значения! Выбранная кнопка отменяется, и выбранные не выбираются. Кто-нибудь знает об этой ошибке? Должен ли я заниматься этим по-другому. - Вот пример, который я пытаюсь сделать.Создание столбца RadioButtons в Adobe Flex

<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> 
    <mx:RadioButtonGroup id="leftAxisGrp" /> 
    <mx:RadioButtonGroup id="rightAxisGrp"> 
    <mx:change> 
     <![CDATA[ 
     trace (rightAxisGrp.selection); 
     trace (rightAxisGrp.selection.data.name); 
     ]]> 
    </mx:change> 
    </mx:RadioButtonGroup> 
    <mx:AdvancedDataGrid 
     id="readingsGrid" 
     designViewDataType="flat" 
     height="150" width="400" 
     sortExpertMode="true" 
     selectable="false"> 
    <mx:columns> 
     <mx:AdvancedDataGridColumn 
      headerText="L" width="25" paddingLeft="6" 
      dataField="left" sortable="false"> 
     <mx:itemRenderer> 
      <mx:Component> 
      <mx:RadioButton groupName="leftAxisGrp" /> 
      </mx:Component> 
     </mx:itemRenderer> 
     </mx:AdvancedDataGridColumn> 
     <mx:AdvancedDataGridColumn 
      headerText="R" width="25" paddingLeft="6" 
      dataField="right" sortable="false"> 
     <mx:itemRenderer> 
      <mx:Component> 
      <mx:RadioButton groupName="rightAxisGrp" /> 
      </mx:Component> 
     </mx:itemRenderer> 
     </mx:AdvancedDataGridColumn> 
     <mx:AdvancedDataGridColumn headerText="" dataField="name" /> 
    </mx:columns> 
    <mx:dataProvider> 
     <mx:Array> 
     <mx:Object left="false" right="false" name="Reddish-gray Mouse Lemur" /> 
     <mx:Object left="false" right="false" name="Golden-brown Mouse Lemur" /> 
     <mx:Object left="false" right="false" name="Northern Rufous Mouse Lemur" /> 
     <mx:Object left="false" right="false" name="Sambirano Mouse Lemur" /> 
     <mx:Object left="false" right="false" name="Simmons' Mouse Lemur" /> 
     <mx:Object left="false" right="false" name="Pygmy Mouse Lemur" /> 
     <mx:Object left="false" right="false" name="Brown Mouse Lemur" /> 
     <mx:Object left="false" right="false" name="Madame Berthe's Mouse Lemur" /> 
     <mx:Object left="false" right="false" name="Goodman's Mouse Lemur" /> 
     <mx:Object left="false" right="false" name="Jolly's Mouse Lemur" /> 
     <mx:Object left="false" right="false" name="Mittermeier's Mouse Lemur" /> 
     <mx:Object left="false" right="false" name="Claire's Mouse Lemur" /> 
     <mx:Object left="false" right="false" name="Danfoss' Mouse Lemur" /> 
     <mx:Object left="false" right="false" name="Lokobe Mouse Lemur" /> 
     <mx:Object left="true" right="true" name="Bongolava Mouse Lemur" /> 
     </mx:Array> 
    </mx:dataProvider> 
    </mx:AdvancedDataGrid> 
</mx:WindowedApplication> 

ОБНОВЛЕНО (спасибо законопроект!)

Хорошо! Пойдите, это работает. Мне просто пришлось внести пару изменений из предложения законопроекта. В основном, используя ArrayCollection с ObjectProxy, он был одновременно связующим и динамическим. Одна странная вещь - я не мог выбрать кнопку в первой строке, если бы я заполнил массив во время построения; Я должен был отложить это до тех пор, пока не будет запущено событие creationComplete (это нормально, так как я все равно собираю сетку из db).

<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> 
    <mx:Script> 
    <![CDATA[ 
     import mx.utils.ObjectProxy; 
     import mx.collections.ArrayCollection; 

     [Bindable] 
     private var myData:ArrayCollection = new ArrayCollection(); 

     private function selectItem (selObject:Object, property:String) : void 
     { 
     for each (var obj:ObjectProxy in myData) { 
      obj[property] = (obj.name === selObject.name); 
     } 
     readingsGrid.invalidateDisplayList(); 
     } 
    ]]> 
    </mx:Script> 
    <mx:RadioButtonGroup id="leftAxisGrp"> 
    <mx:change> 
     <![CDATA[ 
     selectItem (leftAxisGrp.selectedValue, 'left'); 
     ]]> 
    </mx:change> 
    </mx:RadioButtonGroup> 
    <mx:RadioButtonGroup id="rightAxisGrp"> 
    <mx:change> 
     <![CDATA[ 
     selectItem (rightAxisGrp.selectedValue, 'right'); 
     ]]> 
    </mx:change> 
    </mx:RadioButtonGroup> 
    <mx:AdvancedDataGrid 
     id="readingsGrid" 
     designViewDataType="flat" 
     dataProvider="{myData}" 
     sortExpertMode="true" 
     height="150" width="400" 
     selectable="false"> 
    <mx:columns> 
     <mx:AdvancedDataGridColumn id="leftCol" 
      headerText="L" width="25" paddingLeft="6" sortable="false"> 
     <mx:itemRenderer> 
      <mx:Component> 
      <mx:RadioButton groupName="leftAxisGrp" 
       buttonMode="true" value="{data}" selected="{data.left}" /> 
      </mx:Component> 
     </mx:itemRenderer> 
     </mx:AdvancedDataGridColumn> 
     <mx:AdvancedDataGridColumn id="rightCol" 
      headerText="R" width="25" paddingLeft="6" sortable="false"> 
     <mx:itemRenderer> 
      <mx:Component> 
      <mx:RadioButton groupName="rightAxisGrp" 
       buttonMode="true" value="{data}" selected="{data.right}" /> 
      </mx:Component> 
     </mx:itemRenderer> 
     </mx:AdvancedDataGridColumn> 
     <mx:AdvancedDataGridColumn headerText="" dataField="name" /> 
    </mx:columns> 
    <mx:creationComplete> 
     <![CDATA[ 
     myData.addItem(new ObjectProxy ({ left:true, right:true, name:"Golden-brown Mouse Lemur" })); 
     myData.addItem(new ObjectProxy ({ left:false, right:false, name:"Reddish-gray Mouse Lemur" })); 
     myData.addItem( new ObjectProxy ({ left:false, right:false, name:"Northern Rufous Mouse Lemur" })); 
     myData.addItem( new ObjectProxy ({ left:false, right:false, name:"Sambirano Mouse Lemur" })); 
     myData.addItem( new ObjectProxy ({ left:false, right:false, name:"Simmons' Mouse Lemur" })); 
     myData.addItem( new ObjectProxy ({ left:false, right:false, name:"Pygmy Mouse Lemur" })); 
     myData.addItem( new ObjectProxy ({ left:false, right:false, name:"Brown Mouse Lemur" })); 
     myData.addItem( new ObjectProxy ({ left:false, right:false, name:"Madame Berthe's Mouse Lemur" })); 
     myData.addItem( new ObjectProxy ({ left:false, right:false, name:"Goodman's Mouse Lemur" })); 
     myData.addItem( new ObjectProxy ({ left:false, right:false, name:"Jolly's Mouse Lemur" })); 
     myData.addItem( new ObjectProxy ({ left:false, right:false, name:"Mittermeier's Mouse Lemur" })); 
     myData.addItem( new ObjectProxy ({ left:false, right:false, name:"Claire's Mouse Lemur" })); 
     myData.addItem( new ObjectProxy ({ left:false, right:false, name:"Danfoss' Mouse Lemur" })); 
     myData.addItem( new ObjectProxy ({ left:false, right:false, name:"Lokobe Mouse Lemur" })); 
     myData.addItem( new ObjectProxy ({ left:false, right:false, name:"Bongolava Mouse Lemur" }));    
     ]]> 
    </mx:creationComplete> 
    </mx:AdvancedDataGrid> 
</mx:WindowedApplication> 

ответ

1

Что здесь происходит, так это то, что Flex создает только экземпляры itemRenderer для столбцов , видимых. Когда вы просматриваете, эти экземпляры перерабатываются. Поэтому, если вы прокрутите вниз, объект RadioButton, который рисовал первый столбец первой строки, теперь может измениться, вместо этого будет рисовать первый столбец седьмой строки. Когда это происходит, Flex сбрасывает свойство «data» объекта itemRenderer.

Так что, если имеется 15 строк данных, есть только 12 радиобатов (6 для «левых» и 6 для «правой» для 6 видимых строк), а не 30 радиобатов, как и следовало ожидать. Это не большая проблема, если вы только , отображая выбор, но это становится проблемой, когда вы разрешаете обновления.

Чтобы устранить проблему с отображением, вместо установки «dataField» в столбце, вы можете привязать свойство «selected» RadioButton к значению data.left (или справа) элемента itemRenderer. Затем вам нужно будет сделать элементы в вашем dataProvider «Bindable».

Чтобы устранить проблему обновления, поскольку вы привязываетесь непосредственно к значениям элемента dataProvider, вам обязательно нужно их обновить. Поскольку для одного элемента RadioButton нет одного элемента, для этого вам понадобится другая схема. В этом случае я помещаю в обработчик, который идет, и устанавливает свойство left/right каждого элемента на «false», за исключением «выбранного», который получает значение «true».

Я обновил ваш пример кода на основе этих мыслей. Попробуйте что-то вроде этого:

<?xml version="1.0" encoding="utf-8"?> 
<mx:Application layout="absolute" 
    xmlns:my="*" 
    xmlns:mx="http://www.adobe.com/2006/mxml"> 
    <mx:RadioButtonGroup id="leftAxisGrp" 
     change="selectItem(leftAxisGrp.selectedValue, 'left');"/> 
    <mx:RadioButtonGroup id="rightAxisGrp" 
     change="selectItem(rightAxisGrp.selectedValue, 'right');"> 
    </mx:RadioButtonGroup> 
    <mx:AdvancedDataGrid 
     id="readingsGrid" 
     designViewDataType="flat" 
     height="150" width="400" 
     sortExpertMode="true" 
     selectable="false" 
     dataProvider="{adgData.object}"> 
    <mx:columns> 
     <mx:AdvancedDataGridColumn 
      headerText="L" width="25" paddingLeft="6" 
      sortable="false"> 
     <mx:itemRenderer> 
      <mx:Component> 
      <mx:RadioButton groupName="leftAxisGrp" 
       value="{data}" selected="{data.left}"/> 
      </mx:Component> 
     </mx:itemRenderer> 
     </mx:AdvancedDataGridColumn> 
     <mx:AdvancedDataGridColumn 
      headerText="R" width="25" paddingLeft="6" 
      sortable="false"> 
     <mx:itemRenderer> 
      <mx:Component> 
      <mx:RadioButton groupName="rightAxisGrp" 
       value="{data}" selected="{data.right}"/> 
      </mx:Component> 
     </mx:itemRenderer> 
     </mx:AdvancedDataGridColumn> 
     <mx:AdvancedDataGridColumn headerText="" dataField="name" /> 
    </mx:columns> 
    </mx:AdvancedDataGrid> 
    <mx:Model id="adgData"> 
     <root> 
     <object left="false" right="false" name="Reddish-gray Mouse Lemur" /> 
     <object left="false" right="false" name="Golden-brown Mouse Lemur" /> 
     <object left="false" right="false" name="Northern Rufous Mouse Lemur" /> 
     <object left="false" right="false" name="Sambirano Mouse Lemur" /> 
     <object left="false" right="false" name="Simmons' Mouse Lemur" /> 
     <object left="false" right="false" name="Pygmy Mouse Lemur" /> 
     <object left="false" right="false" name="Brown Mouse Lemur" /> 
     <object left="false" right="false" name="Madame Berthe's Mouse Lemur" /> 
     <object left="false" right="false" name="Goodman's Mouse Lemur" /> 
     <object left="false" right="false" name="Jolly's Mouse Lemur" /> 
     <object left="false" right="false" name="Mittermeier's Mouse Lemur" /> 
     <object left="false" right="false" name="Claire's Mouse Lemur" /> 
     <object left="false" right="false" name="Danfoss' Mouse Lemur" /> 
     <object left="false" right="false" name="Lokobe Mouse Lemur" /> 
     <object left="true" right="true" name="Bongolava Mouse Lemur" /> 
     </root> 
    </mx:Model> 
    <mx:Script> 
    <![CDATA[ 
     private function selectItem(selObject:Object, property:String) : void { 
      for each(var obj:Object in adgData.object) { 
       obj[property] = (obj === selObject); 
      } 
      readingsGrid.invalidateDisplayList(); 
     } 
    ]]> 
    </mx:Script> 
</mx:Application> 
0

Воспроизведено это. Вероятно, это ошибка ADG, мы столкнулись с некоторыми из них. (Не нашел это на bugs.adobe.com, но их поиск отстой).

Вы можете попробовать Flex 3.0.3 или создать ночную сборку here (предупреждение, может быть, очень сломанное), и посмотреть, исправлены ли они, или вы можете попробовать реализовать собственный рендерер, но это больно быть правым.