0

有没有办法听这个?我可以轻松地收听选择 RadioButton 的单击,但我似乎找不到在取消选择 RadioButton 时收听的方法。

有任何想法吗?

谢谢!

4

1 回答 1

0

回到 Flex 2 天,当取消选择单选按钮时触发“更改”事件。然而,出于某种原因,这种小小的便利在 Flex 3 中消失了,而且我不相信我们得到了任何形式的替换事件。

在 RadioButtonGroup 级别处理您的事件一切都很好,除了有时您真的想在单选按钮级别处理事件 - 特别是如果您希望通过 itemRenderer 与数据提供程序条目交互绘制单选按钮。

方便的是,我有一些样板代码,您可以将它们用作 RadioButton 和 RadioButtonGroup 的替代品,它们在单选按钮级别提供“取消选择”事件。首先是 SmartRadioButton:

<?xml version="1.0" encoding="utf-8"?>
<s:RadioButton xmlns:fx="http://ns.adobe.com/mxml/2009" 
               xmlns:s="library://ns.adobe.com/flex/spark" 
               xmlns:mx="library://ns.adobe.com/flex/mx">
    <fx:Script>
        <![CDATA[
            import events.SmartRadioButtonEvent;

            public function notifyDeselect():void {
                dispatchEvent(new SmartRadioButtonEvent('deselect'));
            }
        ]]>
    </fx:Script>

    <fx:Metadata>
        [Event(name="deselect", type="events.SmartRadioButtonEvent")]
    </fx:Metadata>
</s:RadioButton>

这是 SmartRadioButtonGroup:

<?xml version="1.0" encoding="utf-8"?>
<s:RadioButtonGroup xmlns:fx="http://ns.adobe.com/mxml/2009" 
                    xmlns:s="library://ns.adobe.com/flex/spark" 
                    xmlns:mx="library://ns.adobe.com/flex/mx"
                    change="selectionChanged();"
                    >
    <fx:Script>
        <![CDATA[
            import spark.components.RadioButton;

            import components.SmartRadioButton;

            protected var oldSelection:SmartRadioButton = null;

            // Notify our old selection that it has been deselected, and update
            // the reference to the new selection.
            public function selectionChanged():void {
                var newSelection:SmartRadioButton = this.selection as SmartRadioButton;
                if (oldSelection == newSelection) return;
                if (oldSelection != null) {
                    oldSelection.notifyDeselect();
                }
                oldSelection = newSelection;
            }

            // Override some properties to make sure that we update oldSelection correctly,
            // in the event of a programmatic selection change.
            override public function set selectedValue(value:Object):void {
                super.selectedValue = value;
                oldSelection = super.selection as SmartRadioButton;
            }

            override public function set selection(value:RadioButton):void {
                super.selection = value;
                oldSelection = super.selection as SmartRadioButton;
            }

        ]]>
    </fx:Script>
</s:RadioButtonGroup>

这两个属性覆盖在那里确保我们正确更新 oldSelection,以防对组的选择进行编程更改。

SmartRadioButtonEvent 没有什么花哨或重要的东西。它可能只是一个普通的事件,因为没有特殊的有效负载。

我已经测试了上面的代码,并且一切正常,但是如果在更大的系统中使用它,肯定存在边缘条件和其他应该解决的奇怪问题。

于 2013-05-29T06:26:02.550 回答