我有一个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
我想这是因为group
中RadioButton
的设定者是一个愚蠢的设定者;它所做的就是复制到变量,这不会产生groupName
所做的魔力。但是,我似乎无法找到用于正确设置RadioButton.groupName
属性的值。
所以,简而言之,我很难理解如何让这些位相互通信。我该怎么做?
- 编辑 -
事实证明,我可以通过设置groupName属性来创建和关联组,但我无法在组中设置选择侦听器;在设置过程之后,该组立即为NULL,这意味着下面的第二行会抛出与NPE相当的Flex:
control.groupName = groupNameForLevel(item);
control.group.addEventListener(Event.SELECT, updateSelection);
答案 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,看看它究竟在哪里失败。您是否以编程方式创建了该组?如果是这种情况,也许它还没有完全初始化。