代码之家  ›  专栏  ›  技术社区  ›  D3vtr0n

如何重写Flex树控件中的子节点控件

  •  0
  • D3vtr0n  · 技术社区  · 14 年前

                private function treeClick(e:ListEvent):void {
    
                _selectedItem = Tree(e.currentTarget).selectedItem;
    
                if(mainTree.dataDescriptor.isBranch(_selectedItem)) {
                    Alert.show('branch click');
                }
                else {
                    Alert.show('leaf node click');
                }
    
            }
    

    我从下面的代码中查看TreeItemRenderer重写类 example here :

    我的问题是, 我是否可以直接在MXML组件中重写createChildren函数,而不必使用整个类文件来重写此功能?我必须重新发明轮子才能做到这一点吗?

    我只想在叶节点上添加复选框,如何区分?下面的示例将复选框添加到所有分支和叶节点,但我只想将复选框添加到叶节点/子节点。你会怎么做?

            override protected function createChildren( ): void
            {
                super.createChildren( );
                if( !_checkbox )
                {
                    _checkbox = new CheckBoxExtended( );
                    _checkbox.allow3StateForUser = false;
                    _checkbox.addEventListener( MouseEvent.CLICK, onCheckboxClick );
                    addChild( _checkbox );
                }
            }
    

    以下是我正在使用的XML:

        <mx:XMLList id="treeData">
        <node label="DAIX">
            <node label="Account 1">
                <node label="Premise 1">
                    <node label="Device 1" oid="31" isChecked="false">
                    </node>
                    <node label="Device 2" oid="32" isChecked="false">
                    </node>
                </node>
                <node label="Premise 2">
                    <node label="Device 1" oid="41" isChecked="false">
                    </node>
                    <node label="Device 2" oid="42" isChecked="false">
                    </node>                 
                </node>
            </node>
            <node label="Account 2">
                <node label="Premise 1">
                    <node label="Device 1" oid="31" isChecked="false">
                    </node>
                    <node label="Device 2" oid="32" isChecked="false">
                    </node>             
                </node>
                <node label="Premise 2">
                    <node label="Device 1" oid="31" isChecked="false">
                    </node>
                    <node label="Device 2" oid="32" isChecked="false">
                    </node>                 
                </node>
            </node>
        </node>    
    </mx:XMLList>
    

    <mx:Tree id="mainTree" dataProvider="{treeData}" itemRenderer="TreeCheckBoxItemRenderer" labelField="@label" showRoot="false" width="100%" height="100%" itemClick="treeClick(event)" />
    
    1 回复  |  直到 14 年前
        1
  •  1
  •   Wade Mueller    14 年前

    下面是我要做的:创建从TreeItemRender派生的项目呈现器作为MXML组件,并在MXML中包含复选框,然后重写listData的setter。在重写的方法中,执行以下操作:

    编辑:添加了周围的MXML(注意,MXML与fb4在创建新的树项目呈现器时默认生成的内容几乎完全相同,而且我还没有在树中对此进行测试)

    EDIT2:添加了在组件和数据之间来回移动选中状态的代码。

    <fx:Script>
        <![CDATA[
            import mx.controls.treeClasses.TreeListData;
    
            override public function set listData(value:BaseListData):void
            {
                super.listData = value
                this.myCheckbox.visible = !(value as TreeListData).hasChildren;
                this.myCheckbox.includeInLayout = !(value as TreeListData).hasChildren;
            }
    
            override public function set data(value:Object):void {
                super.data = value;
    
                this.myCheckbox.selected = this.data.isChecked;
            }
    
            private function onCheckboxChange(e:Event):void {
                this.data.isChecked = this.myCheckbox.selected;
            }
        ]]>
    </fx:Script>
    <s:states>
        <s:State name="normal" />      
        <s:State name="hovered" />
        <s:State name="selected" />
    </s:states>
    <s:HGroup left="0" right="0" top="0" bottom="0" verticalAlign="middle">
        <s:Rect id="indentationSpacer" width="{treeListData.indent}" percentHeight="100" alpha="0">
            <s:fill>
                <s:SolidColor color="0xFFFFFF" />
            </s:fill>
        </s:Rect>
        <s:Group id="disclosureGroup">
            <s:BitmapImage source="{treeListData.disclosureIcon}" visible="{treeListData.hasChildren}" />
        </s:Group>
        <s:CheckBox id="myCheckbox" change="onCheckboxChange(event)"/>
        <s:Label id="labelField" text="{treeListData.label}" paddingTop="2"/>
    </s:HGroup>
    

    推荐文章