2014-10-02 127 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綁定將觸發事件並讓我響應該更改。