2014-10-02 69 views
0

我需要显示一个列表,其中每个项目由一个复选框和一个标签组成。为此,我为List创建了一个自定义的itemrenderer类。创建和应用渲染器类非常简单,并且所有内容都可以正确显示。现在,我需要为渲染器类添加一个函数,该函数将执行类似于在复选框被选中或取消选择时更改文本颜色的操作。我知道CheckBox有一个'更改'事件,但是当我试图听这个事件时,我碰到了一个catch-22。我需要将渲染器类的'mouseChildren'属性设置为false以防止List和Checkbox的鼠标事件相互干扰。不幸的是,将该属性设置为false也会阻止复选框发生更改事件,所以我的处理程序永远不会被调用。我完全沉迷于此,任何帮助将不胜感激。检测项目渲染器中的复选框选择

仅供参考,这里是我的渲染器类的代码:

<?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" 
       mouseChildren="false" 
       width="100%"> 
    <s:states> 
     <s:State name="normal"/> 
     <s:State name="hovered"/> 
     <s:State name="selected"/> 
    </s:states> 
    <s:HGroup left="10" 
       right="0" 
       top="0" 
       bottom="0" 
       verticalAlign="middle" 
       gap="3"> 
     <s:CheckBox selected.selected="true" 
        change="{handleCBChange()}"/> 
     <s:Label text="{data.value}" 
       width="100%"/> 
    </s:HGroup> 
    <fx:Script> 
     <![CDATA[ 
      public function handleCBChange():void 
      { 
       trace("Checkbox clicked"); 
      } 
     ]]> 
    </fx:Script> 
</s:ItemRenderer> 

回答

0

敲我的头靠在一段时间之后,我想我终于想通了这个问题。关键是我如何选择约束力。

selected.selected =“真”

代码的目的是要确保,如果用户点击列表项(从而改变渲染器状态)的任何地方的复选框被触发。这样做的麻烦是点击实际的复选框也会导致选定的值发生变化。所以状态变化是将'selected'设置为true,然后复选框通过将其设置回false来响应点击。通过设置'mouseChildren'为false,我阻止了复选框上的鼠标事件回退选择。不幸的是,它也抑制了我试图倾听的'变化'事件。

好的新功能是,我找到了解决方法。而不是倾听复选框的“更改”事件,而是添加了“valueCommit”事件的侦听器。由于valueCommit是通过对“selected”进行编程更改而触发的,因此selected.selected = true绑定将触发事件并让我响应该更改。