我在测验应用程序中正确使用多个RadioButton组件和RadioButtonGroup时遇到一些问题(当它们通过DataGridColumn下的ItemRenderer呈现时)。
测验页面显示一个问题以及4个可能的答案,这些答案由RadioButton组件表示(与唯一的RadioButtonGroup绑定)。测验通常包含许多选择题。
一切正常,直到我导航到下一个问题并返回上一个问题;然后我可以在单选按钮中看到我以前的答案选择,虽然当我改变我的答案并选择一个不同的单选按钮时,它会保留我的旧选择并添加新的选择,这完全是不合理的(因为RadioButtonGroup应该只强制选择一个选项) 。
以下是我定义DataGridColumn的方法:
<mx:DataGrid y="141" height="373" dataProvider="{currentQuestion.answers}" id="answersGrid" visible="false" styleName="NoStyleDataGrid" useRollOver="false" headerHeight="0" width="381" x="461" variableRowHeight="true">
<mx:columns>
<mx:DataGridColumn width="20" dataField="key">
<mx:itemRenderer>
<mx:Component>
<mx:Canvas width="100%" height="100%" verticalScrollPolicy="off" horizontalScrollPolicy="off" top="0">
<mx:Script>
<![CDATA[
import mx.core.Application;
]]>
</mx:Script>
<mx:RadioButton id="rb" value="{data.number}" selected="{outerDocument.isSelected(data.number,rb)}" group="{outerDocument.getGroup()}" click="outerDocument.setAnswerState(event,data.number)" width="100%" height="30" x="12" y="0" />
</mx:Canvas>
</mx:Component>
</mx:itemRenderer>
</mx:DataGridColumn>
我使用以下代码确保每个问题都有自己唯一的Group来包含RadioButton组件(作为答案):
public function getGroup():RadioButtonGroup{
if(radioGroupMap[currentQuestion.key]!=null){
return radioGroupMap[currentQuestion.key] as RadioButtonGroup;
}
radioGroupMap[currentQuestion.key] = new RadioButtonGroup();
return radioGroupMap[currentQuestion.key] as RadioButtonGroup;
}
只要我不转到下一个问题并返回上一个问题,此代码就可以正常工作。
感谢您对此问题的任何帮助。
谢谢!
答案 0 :(得分:0)
在做了一些研究之后,似乎包含RadioButtons和数据网格列上的RadioButtonGroup的项目渲染器不是一个好的设计选择。显然,由于性能原因,创建了比实际需要更多的项目渲染器,这使得UI以不可预测的方式运行。
我使用了VBOX,并使用ActionScript动态创建了RadioButton和RadioButtonGroup。这是一些代码示例:
function populateAnswers(){
var rbg:RadioButtonGroup = new RadioButtonGroup();
for each ( var ans:Answer in currentQuestion.answers){
var row:HBox = new HBox();
var rb:RadioButton = new RadioButton();
rb.group = rbg;
rb.id = ""+ans.number;
var num:int = ans.number;
rb.addEventListener(MouseEvent.CLICK,setAnswerState);
rb.selected = isSelected(ans.number);
row.addChild(rb);
var answerBoby:Text = new Text();
answerBoby.enabled = false;
answerBoby.styleName = "readOnlyTA";
answerBoby.selectable = false;
answerBoby.htmlText = ans.body;
row.addChild(answerBoby);
quizAnswersPanel.addChild(row);
}