1

我有一个 Spark.List 的自定义 itemrenderer

<?xml version="1.0" encoding="utf-8"?>
<s:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009"
                xmlns:s="library://ns.adobe.com/flex/spark"
                xmlns:mx="library://ns.adobe.com/flex/mx"
                autoDrawBackground="true">
    <s:states>
        <s:State name="normal"/>
        <s:State name="selected"/>
        <s:State name="hovered"/>
    </s:states>
    <s:CheckBox label="{data.name}" selected.selected="true" selected.normal="false"/>

</s:ItemRenderer>

名单:

        private function get UOAbilitate():List
        {
            var l:List = new List();
            l.dataProvider = listaUOA;
            l.allowMultipleSelection = true;                
            l.itemRenderer = new ClassFactory(CheckBoxItemRenderer);
            return l;                   
        }
        [Bindable]private var listaUOA:ArrayCollection = new ArrayCollection([
                {name: "Uo1"},
                {name: "Uo2"},
                {name: "Uo3"},
                {name: "Uo4"},
                {name: "Uo5"},
                {name: "Uo6"},
                {name: "Uo7"},
                {name: "Uo8"},
                {name: "Uo9"},
                {name: "Uo10"},
                {name: "Uo11"},
                {name: "Uo12"}
            ]);     

复选框以正确的方式运行。如果我选择了一个值,那么选择另一个值将导致选择新值并取消选择旧值..

使用 CTRL 两个项目保持选中状态..我将获得相同的结果而无需按 ctrl 键...

4

2 回答 2

2

最简单的方法是创建一个 List 的子类,如下所示:

public class MyList extends List {

    public function MyList() {
        allowMultipleSelection = true;
    }

    override protected function item_mouseDownHandler(event:MouseEvent):void {
        event.ctrlKey = true;
        super.item_mouseDownHandler(event);
    }

}

我们默认设置allowMultipleSelectiontrue(List 组件的默认值为false),并拦截 MouseEvent.MOUSE_DOWN 以便我们可以欺骗 List 以为始终按下 CTRL 键。

如果您正在寻找 DataGrid 类的类似行为,请阅读此答案:火花 Datagrid 中的 SelectItem 方法?

注意:对于 CheckBoxes 情况列表,我创建了一个名为 CheckBoxGroup 的可重用自定义组件,它执行此操作并默认分配 CheckBoxItemRenderer。这样我就不必一遍又一遍地这样做。(它还做了一些其他自定义的事情,比如一次选择所有的框,但这不是主题)。

于 2012-06-28T10:26:24.190 回答
0

上述解决方案有效,但有一个小错误!正确的代码是:

public class MyList extends List {

    public function MyList() {
        allowMultipleSelection = true;
    }

    override protected function handleCellRendererClick(event:MouseEvent):void {
         event.ctrlKey = true;
        super.handleCellRendererClick(event);
    }
}
于 2013-12-01T00:21:40.427 回答