Apache flex 单击嵌入式复选框时组合框不关闭[FLEX]

Apache flex 单击嵌入式复选框时组合框不关闭[FLEX],apache-flex,checkbox,combobox,tree,Apache Flex,Checkbox,Combobox,Tree,我已经到了一个点,我有一个下拉列表,其中嵌入了一棵树。每个节点都有一个复选框 这样做的目的是能够导航并勾选复选框,而无需关闭下拉列表。 单击复选框后,无法使此下拉列表保持打开状态 当在PermissionTreeItemRenderV2.as>handleChkClick(evt)>this.itemXml中更新xml时,会发生关闭下拉列表的事件。@选中={“0”或“1”} 你知道如何调整代码来禁用这个恼人的事件吗 示例\u combobox.mxml: <?xml version="1.

我已经到了一个点,我有一个下拉列表,其中嵌入了一棵树。每个节点都有一个复选框

这样做的目的是能够导航并勾选复选框,而无需关闭下拉列表。 单击复选框后,无法使此下拉列表保持打开状态

当在PermissionTreeItemRenderV2.as>handleChkClick(evt)>this.itemXml中更新xml时,会发生关闭下拉列表的事件。@选中={“0”或“1”}

你知道如何调整代码来禁用这个恼人的事件吗

示例\u combobox.mxml:

<?xml version="1.0"?> 
<mx:Application xmlns:local="local.*" 
                xmlns:mx="http://www.adobe.com/2006/mxml"
                creationComplete="loadXML()"> 
    <mx:Script> 
        <![CDATA[ 
            import mx.collections.XMLListCollection; 
            import mx.rpc.events.ResultEvent;
            import mx.rpc.http.mxml.HTTPService; 

            public var xmlService:HTTPService = new HTTPService(); 
            [Bindable]
            public var xmlResult:XML;
            [Bindable]
            public var xmlList:XMLList; 
            [Bindable]
            public var xmlTeams:XMLListCollection;

            public function loadXML():void
            {
                xmlService.url = "mlb.xml"           
                xmlService.resultFormat = "e4x";
                xmlService.addEventListener(ResultEvent.RESULT, resultHandler); 
                xmlService.send();
            }

            public function resultHandler(event:ResultEvent):void 
            {
                xmlResult = XML(event.result);
                xmlList = xmlResult.league;
                xmlTeams = new XMLListCollection(xmlList);
            }
        ]]>
    </mx:Script>    

    <local:TreeComboBox
        width="300"
        id="combo"
        labelField="@label" dataProvider="{xmlTeams}" />
</mx:Application>
<?xml version="1.0" encoding="utf-8"?> 
<local:ComboBoxNoClose xmlns:mx="http://www.adobe.com/2006/mxml" 
                        xmlns:local="local.*">
    <mx:Script> 
        <![CDATA[ 
            import mx.events.FlexEvent; 

            [Bindable] 
            private var _label:String; 
            [Bindable] 
            public var treeSelectedItem:Object;

            public function updateLabel(event:*):void 
            {   
                _label = event.currentTarget.selectedItem[this.labelField];     
                treeSelectedItem = event.currentTarget.selectedItem;
            }

            override protected function updateDisplayList(unscaledWidth:Number,
                                                          unscaledHeight:Number):void 
            {
                super.updateDisplayList(unscaledWidth, unscaledHeight);
                if(dropdown && _label != null){
                    text = "";//_label;
                }
            }
        ]]>
    </mx:Script>
    <local:dropdownFactory>
        <mx:Component>
            <mx:Tree change="outerDocument.updateLabel(event)" height="500"
                     width="500"
                     itemRenderer="local.PermissionsTreeItemRendererV2"
                     folderClosedIcon="{null}"
                     folderOpenIcon="{null}"
                     defaultLeafIcon="{null}" />
        </mx:Component>
    </local:dropdownFactory>

</local:ComboBoxNoClose>
package local
{
    import flash.events.Event;
    import flash.events.MouseEvent;

    import mx.controls.CheckBox;
    import mx.controls.ComboBox;
    import mx.events.DropdownEvent;
    import mx.events.ListEvent;

    public class ComboBoxNoClose extends ComboBox
    {
        public function ComboBoxNoClose()
        {
            super();
        }

        public function onOpen(event:Event):void
        {
            event.stopImmediatePropagation();
        }

        public override function close(trigger:Event = null):void
        {
            if (trigger != null)
            {
                super.close();
            }
        }
    }
}
<?xml version="1.0" encoding="utf-8"?> 
<root> 
        <league label="American League"> 
                <division label="West"> 
                        <team label="Los Angeles" /> 
                        <team label="Seattle" /> 
                        <team label="Oakland" /> 
                        <team label="Texas" /> 
                </division> 
                <division label="Central"> 
                        <team label="Cleveland" /> 
                        <team label="Detroit" /> 
                        <team label="Minnesota" /> 
                        <team label="Chicago" /> 
                        <team label="Kansas City" /> 
                </division> 
                <division label="East"> 
                        <team label="Boston" /> 
                        <team label="New York" /> 
                        <team label="Toronto" /> 
                        <team label="Baltimore" /> 
                        <team label="Tampa Bay" /> 
                </division> 
        </league> 
</root>
comboxnoclose.as:

<?xml version="1.0"?> 
<mx:Application xmlns:local="local.*" 
                xmlns:mx="http://www.adobe.com/2006/mxml"
                creationComplete="loadXML()"> 
    <mx:Script> 
        <![CDATA[ 
            import mx.collections.XMLListCollection; 
            import mx.rpc.events.ResultEvent;
            import mx.rpc.http.mxml.HTTPService; 

            public var xmlService:HTTPService = new HTTPService(); 
            [Bindable]
            public var xmlResult:XML;
            [Bindable]
            public var xmlList:XMLList; 
            [Bindable]
            public var xmlTeams:XMLListCollection;

            public function loadXML():void
            {
                xmlService.url = "mlb.xml"           
                xmlService.resultFormat = "e4x";
                xmlService.addEventListener(ResultEvent.RESULT, resultHandler); 
                xmlService.send();
            }

            public function resultHandler(event:ResultEvent):void 
            {
                xmlResult = XML(event.result);
                xmlList = xmlResult.league;
                xmlTeams = new XMLListCollection(xmlList);
            }
        ]]>
    </mx:Script>    

    <local:TreeComboBox
        width="300"
        id="combo"
        labelField="@label" dataProvider="{xmlTeams}" />
</mx:Application>
<?xml version="1.0" encoding="utf-8"?> 
<local:ComboBoxNoClose xmlns:mx="http://www.adobe.com/2006/mxml" 
                        xmlns:local="local.*">
    <mx:Script> 
        <![CDATA[ 
            import mx.events.FlexEvent; 

            [Bindable] 
            private var _label:String; 
            [Bindable] 
            public var treeSelectedItem:Object;

            public function updateLabel(event:*):void 
            {   
                _label = event.currentTarget.selectedItem[this.labelField];     
                treeSelectedItem = event.currentTarget.selectedItem;
            }

            override protected function updateDisplayList(unscaledWidth:Number,
                                                          unscaledHeight:Number):void 
            {
                super.updateDisplayList(unscaledWidth, unscaledHeight);
                if(dropdown && _label != null){
                    text = "";//_label;
                }
            }
        ]]>
    </mx:Script>
    <local:dropdownFactory>
        <mx:Component>
            <mx:Tree change="outerDocument.updateLabel(event)" height="500"
                     width="500"
                     itemRenderer="local.PermissionsTreeItemRendererV2"
                     folderClosedIcon="{null}"
                     folderOpenIcon="{null}"
                     defaultLeafIcon="{null}" />
        </mx:Component>
    </local:dropdownFactory>

</local:ComboBoxNoClose>
package local
{
    import flash.events.Event;
    import flash.events.MouseEvent;

    import mx.controls.CheckBox;
    import mx.controls.ComboBox;
    import mx.events.DropdownEvent;
    import mx.events.ListEvent;

    public class ComboBoxNoClose extends ComboBox
    {
        public function ComboBoxNoClose()
        {
            super();
        }

        public function onOpen(event:Event):void
        {
            event.stopImmediatePropagation();
        }

        public override function close(trigger:Event = null):void
        {
            if (trigger != null)
            {
                super.close();
            }
        }
    }
}
<?xml version="1.0" encoding="utf-8"?> 
<root> 
        <league label="American League"> 
                <division label="West"> 
                        <team label="Los Angeles" /> 
                        <team label="Seattle" /> 
                        <team label="Oakland" /> 
                        <team label="Texas" /> 
                </division> 
                <division label="Central"> 
                        <team label="Cleveland" /> 
                        <team label="Detroit" /> 
                        <team label="Minnesota" /> 
                        <team label="Chicago" /> 
                        <team label="Kansas City" /> 
                </division> 
                <division label="East"> 
                        <team label="Boston" /> 
                        <team label="New York" /> 
                        <team label="Toronto" /> 
                        <team label="Baltimore" /> 
                        <team label="Tampa Bay" /> 
                </division> 
        </league> 
</root>
填充树的mlb.xml:

<?xml version="1.0"?> 
<mx:Application xmlns:local="local.*" 
                xmlns:mx="http://www.adobe.com/2006/mxml"
                creationComplete="loadXML()"> 
    <mx:Script> 
        <![CDATA[ 
            import mx.collections.XMLListCollection; 
            import mx.rpc.events.ResultEvent;
            import mx.rpc.http.mxml.HTTPService; 

            public var xmlService:HTTPService = new HTTPService(); 
            [Bindable]
            public var xmlResult:XML;
            [Bindable]
            public var xmlList:XMLList; 
            [Bindable]
            public var xmlTeams:XMLListCollection;

            public function loadXML():void
            {
                xmlService.url = "mlb.xml"           
                xmlService.resultFormat = "e4x";
                xmlService.addEventListener(ResultEvent.RESULT, resultHandler); 
                xmlService.send();
            }

            public function resultHandler(event:ResultEvent):void 
            {
                xmlResult = XML(event.result);
                xmlList = xmlResult.league;
                xmlTeams = new XMLListCollection(xmlList);
            }
        ]]>
    </mx:Script>    

    <local:TreeComboBox
        width="300"
        id="combo"
        labelField="@label" dataProvider="{xmlTeams}" />
</mx:Application>
<?xml version="1.0" encoding="utf-8"?> 
<local:ComboBoxNoClose xmlns:mx="http://www.adobe.com/2006/mxml" 
                        xmlns:local="local.*">
    <mx:Script> 
        <![CDATA[ 
            import mx.events.FlexEvent; 

            [Bindable] 
            private var _label:String; 
            [Bindable] 
            public var treeSelectedItem:Object;

            public function updateLabel(event:*):void 
            {   
                _label = event.currentTarget.selectedItem[this.labelField];     
                treeSelectedItem = event.currentTarget.selectedItem;
            }

            override protected function updateDisplayList(unscaledWidth:Number,
                                                          unscaledHeight:Number):void 
            {
                super.updateDisplayList(unscaledWidth, unscaledHeight);
                if(dropdown && _label != null){
                    text = "";//_label;
                }
            }
        ]]>
    </mx:Script>
    <local:dropdownFactory>
        <mx:Component>
            <mx:Tree change="outerDocument.updateLabel(event)" height="500"
                     width="500"
                     itemRenderer="local.PermissionsTreeItemRendererV2"
                     folderClosedIcon="{null}"
                     folderOpenIcon="{null}"
                     defaultLeafIcon="{null}" />
        </mx:Component>
    </local:dropdownFactory>

</local:ComboBoxNoClose>
package local
{
    import flash.events.Event;
    import flash.events.MouseEvent;

    import mx.controls.CheckBox;
    import mx.controls.ComboBox;
    import mx.events.DropdownEvent;
    import mx.events.ListEvent;

    public class ComboBoxNoClose extends ComboBox
    {
        public function ComboBoxNoClose()
        {
            super();
        }

        public function onOpen(event:Event):void
        {
            event.stopImmediatePropagation();
        }

        public override function close(trigger:Event = null):void
        {
            if (trigger != null)
            {
                super.close();
            }
        }
    }
}
<?xml version="1.0" encoding="utf-8"?> 
<root> 
        <league label="American League"> 
                <division label="West"> 
                        <team label="Los Angeles" /> 
                        <team label="Seattle" /> 
                        <team label="Oakland" /> 
                        <team label="Texas" /> 
                </division> 
                <division label="Central"> 
                        <team label="Cleveland" /> 
                        <team label="Detroit" /> 
                        <team label="Minnesota" /> 
                        <team label="Chicago" /> 
                        <team label="Kansas City" /> 
                </division> 
                <division label="East"> 
                        <team label="Boston" /> 
                        <team label="New York" /> 
                        <team label="Toronto" /> 
                        <team label="Baltimore" /> 
                        <team label="Tampa Bay" /> 
                </division> 
        </league> 
</root>

弹出窗口的默认行为是,当您单击下拉菜单时,它会自动关闭。你可以这样解决这个问题

    <mx:PopUpButton id="popup" width="100%" label="{label}" close="popup_closeHandler(event)" open="popup_openHandler(event)" openAlways="true">
        <mx:popUp>
            <mx:VBox width="{popup.width*1.25}" mouseEnabled="false" verticalGap="1">
                <mx:List id="listSelectAll" width="100%" rowCount="1" selectable="true" itemClick="listSelectAll_itemClickHandler(event)">
                    <mx:dataProvider>
                        <mx:Array>
                            <mx:Object id="selectAll" selected="" label="All"/>
                        </mx:Array>
                    </mx:dataProvider>
                    <mx:itemRenderer>
                        <mx:Component>
                            <mx:HBox width="100%" height="100%" mouseChildren="false">
                                <mx:CheckBox selected="{data.selected}" label="{data.label}" width="100%"/>
                            </mx:HBox>
                        </mx:Component>
                    </mx:itemRenderer>
                </mx:List>
                <mx:List id="listItems" width="100%" dataProvider="{_dataProvider}" itemClick="listItems_itemClickHandler(event)" variableRowHeight="true">
                    <mx:itemRenderer>
                        <mx:Component>
                            <!--
                            <mx:HBox width="100%" height="100%" mouseChildren="false" verticalAlign="middle">
                                <mx:CheckBox selected="{data[outerDocument.selectedField]}" label="{data[outerDocument.labelField]}" width="100%"/>
                            </mx:HBox>
                            -->
                            <mx:HBox width="100%" mouseChildren="false" verticalAlign="middle" horizontalAlign="left" paddingLeft="4">
                                <mx:Script>
                                    <![CDATA[
                                        override public function set data(value: Object) : void {
                                            super.data = value;
                                            if(data.iconCache == null || outerDocument.cacheIcon == false) {
                                                imgIcon.source = data[outerDocument.iconField];
                                            } else {
                                                imgIcon.source = new Bitmap(data.iconCache);
                                            }
                                        }

                                        protected function image_ioErrorHandler(event:IOErrorEvent):void {
                                            imgIcon.visible = imgIcon.includeInLayout = false;
                                        }

                                        protected function imgIcon_completeHandler(event:Event):void {
                                            imgIcon.visible = imgIcon.includeInLayout = true;
                                            if(outerDocument.cacheIcon) {
                                                var bitmapData:BitmapData = Bitmap(imgIcon.content).bitmapData;
                                                //var bitmap:Bitmap = new Bitmap(bitmapData);
                                                data.iconCache = bitmapData;
                                                //imgIcon.removeEventListener(Event.COMPLETE, imgIcon_completeHandler);                                             
                                            }
                                        }

                                    ]]>
                                </mx:Script>

                                <mx:CheckBox id="chkSelected" selected="{data[outerDocument.selectedField]}"/>
                                <mx:Image id="imgIcon" width="{outerDocument.iconWidth}" height="{outerDocument.iconHeight}" visible="{data[outerDocument.iconField]}" includeInLayout="{data[outerDocument.iconField]}" complete="imgIcon_completeHandler(event)" ioError="image_ioErrorHandler(event)"/>
                                <mx:Label id="lblText" text="{data[outerDocument.labelField]}"/>
                            </mx:HBox>
                        </mx:Component>
                    </mx:itemRenderer>
                </mx:List>
            </mx:VBox>
        </mx:popUp>
    </mx:PopUpButton>

或者你也可以访问我的帖子来获得完整的实现