在DataGridColumn中使用RadioButton和RadioButtonGroup(在测验应用程序中)

时间:2015-11-17 21:30:09

标签: actionscript-3 flex flex3 mxml

我在测验应用程序中正确使用多个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;
        }

只要我不转到下一个问题并返回上一个问题,此代码就可以正常工作。

感谢您对此问题的任何帮助。

谢谢!

1 个答案:

答案 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);                     

                }