如何在ActionScript 3中以编程方式将单选按钮与单选按钮组关联?

时间:2009-07-27 19:23:22

标签: flex actionscript-3 flex3

我有一个UI组件,由于各种原因,我必须以编程方式构建。该组件是按列分组的单选按钮表。

现在,我正在构建列组:

private function createGroupsForItemList(items: XMLList): void {
    for each (var item: XML in items) {
        var rbGroup: RadioButtonGroup = new RadioButtonGroup();
        groups[item.@level.toString()] = rbGroup;
    }
}

我正在尝试将RadioButton个实例与列组关联起来,如下所示:

private function createValueControl(item: XML): UIComponent {
    var control: RadioButton = new RadioButton();
    control.label = "";
    control.group = groups[item.@level.toString()];
    control.addEventListener(Event.SELECT, updateSelection);
    return control;
}

我可以在调试器中看到该控件与该组有关联:

control.group == groups[item.@level.toString()]

但是,我同样可以看到该组对控件一无所知:

group.radioButtons.length == 0

我想这是因为groupRadioButton的设定者是一个愚蠢的设定者;它所做的就是复制到变量,这不会产生groupName所做的魔力。但是,我似乎无法找到用于正确设置RadioButton.groupName属性的值。

所以,简而言之,我很难理解如何让这些位相互通信。我该怎么做?

- 编辑 -

事实证明,我可以通过设置groupName属性来创建和关联组,但我无法在组中设置选择侦听器;在设置过程之后,该组立即为NULL,这意味着下面的第二行会抛出与NPE相当的Flex:

control.groupName = groupNameForLevel(item);
control.group.addEventListener(Event.SELECT, updateSelection);

2 个答案:

答案 0 :(得分:1)

第一直觉是这个问题与invalidateDisplayList以及调用的时间和方式有关。当然,由于与该功能相关的问题背后有许多Flex的怪癖,我可能只是替罪羊。

这不是你问题本身的答案,但似乎它实际上可以作为替代解决方案。

RadioButtonGroups将基于IFlexDisplayObject进行初始化。这意味着您可以执行以下操作:

var c:HBox               = new HBox();
var rbg:RadioButtonGroup = new RadioButtonGroup( c );
// do stuff with rbg.
c.addChild( new RadioButton() );

问题在于它可能不是最实用的答案,但它具有成为可行解决方案的明确好处。

答案 1 :(得分:0)

设置groupName应该有效。

我所能建议的是逐步通过RadioButton组件的group()getter,看看它究竟在哪里失败。您是否以编程方式创建了该组?如果是这种情况,也许它还没有完全初始化。