在Adobe Flex中创建RadioButtons列
我正在使用AdvancedDataGrid小部件,我希望两列成为单选按钮,其中每一列都是它自己的RadioButtonGroup。我以为我拥有所有必需的mxxml,但是我遇到了一个奇怪的行为问题。当我上下滚动时,按钮会更改值!所选按钮被取消选择,未选择的按钮被选择。有人对此错误有线索吗?我应该以不同的方式去做吗? -这是我尝试做的精简示例。
<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事件被触发之前(这很好,因为无论如何我将从数据库中填充网格)。
<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>
解决方案
转载此。可能是ADG错误,我们在这里遇到了一些。 (在bugs.adobe.com上找不到此,但是他们的搜索很糟糕)。
我们可以尝试Flex 3.0.3,或者在这里进行每晚构建(警告,可能已经很破损),然后查看他们是否已对其进行修复,或者我们可以尝试实现自定义渲染器,但是这样做很麻烦。
这里发生的是Flex仅为可见列创建itemRenderer实例。当我们滚动时,这些实例将被回收。因此,如果向下滚动,绘制第一行第一列的RadioButton对象现在可能已更改为绘制第七行的第一列。每当发生这种情况时,Flex都会重置itemRenderer的"数据"属性。
因此,尽管有15行数据,但只有12个RadioButton(6个可见行为6个,"左"为6个),而不是我们期望的30个RadioButton。如果仅显示所选内容,这不是一个大问题,但是当我们允许更新时,这将成为更大的问题。
要解决显示问题,我们可以将RadioButton的" selected"属性绑定到itemRenderer的data.left(或者right)值,而不是在列上设置" dataField"。然后,我们需要将dataProvider中的项目设置为"可绑定"。
要解决更新问题,由于我们将直接绑定到dataProvider项值,因此需要确保对其进行更新。由于每个项目都没有一个RadioButton,因此我们需要另一种方案。在这种情况下,我放入一个处理程序,该处理程序将每个项目的left / right属性设置为" false"," selected"除外,该属性设置为" 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>