Flex Spark RadioButton取消选举活动?

时间:2013-05-21 13:24:23

标签: flex events radio-button

有没有办法听这个?我可以轻松地听取选择RadioButton的点击,但是当取消选择RadioButton时,我似乎找不到一种方法来监听。

有什么想法吗?

谢谢!

1 个答案:

答案 0 :(得分: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不是任何花哨或重要的东西。它可能只是一个简单的事件,因为没有特殊的有效载荷。

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