2011-05-26 171 views
0

當我選擇一個或多個數據網格行時,複選框被正確更新,但是當我第一次選擇複選框時,複選框不會刷新,直到指針移出數據網格行。我怎樣才能解決這個問題?帶複選框的Spark數據網格沒有正確更新

<?xml version="1.0" encoding="utf-8"?> 
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
       xmlns:s="library://ns.adobe.com/flex/spark" 
       xmlns:mx="library://ns.adobe.com/flex/mx"> 
    <s:DataGrid id="dg" x="344" y="48" selectionMode="multipleRows" requestedRowCount="4"> 
     <s:columns> 
      <s:ArrayList> 
       <s:GridColumn> 
        <s:itemRenderer> 
         <fx:Component> 
          <s:GridItemRenderer> 
           <fx:Script> 
            <![CDATA[ 
             import mx.controls.Alert; 
             import spark.components.DataGrid; 

             override public function prepare(hasBeenRecycled:Boolean):void 
             { 
              cb.selected = grid.selectionContainsIndex(rowIndex); 
             } 
            ]]> 
           </fx:Script> 
           <s:CheckBox id="cb" label="" horizontalCenter="0"/> 
          </s:GridItemRenderer> 
         </fx:Component> 
        </s:itemRenderer> 
       </s:GridColumn> 
       <s:GridColumn dataField="dataField1" headerText="Column 1"></s:GridColumn> 
       <s:GridColumn dataField="dataField2" headerText="Column 2"></s:GridColumn> 
       <s:GridColumn dataField="dataField3" headerText="Column 3"></s:GridColumn> 
      </s:ArrayList> 
     </s:columns> 
     <s:typicalItem> 
      <fx:Object dataField1="Sample Data" dataField2="Sample Data" dataField3="Sample Data"></fx:Object> 
     </s:typicalItem> 
     <s:ArrayList> 
      <fx:Object dataField1="data1" dataField2="data1" dataField3="data1"></fx:Object> 
      <fx:Object dataField1="data2" dataField2="data2" dataField3="data2"></fx:Object> 
      <fx:Object dataField1="data3" dataField2="data3" dataField3="data3"></fx:Object> 
      <fx:Object dataField1="data4" dataField2="data4" dataField3="data4"></fx:Object> 
     </s:ArrayList> 
    </s:DataGrid> 
</s:Application> 

回答

0

你可以通過在ItemRenderer繪製CheckBox外形和使用狀態,顯示刻度假的CheckBox

<s:GridItemRenderer> 
    <s:states> 
     <s:State name="normal" /> 
     <s:State name="hovered" /> 
     <s:State name="selected" /> 
    </s:states> 

    <!-- checkbox graphics --> 
    <s:Group width="16" height="16" horizontalCenter="0" verticalCenter="0"> 
     <s:Rect left="0" right="0" top="0" bottom="0"> 
      <s:fill> 
       <s:SolidColor color="0xffffff" /> 
      </s:fill> 
      <s:stroke> 
       <s:SolidColorStroke color="0xa9aeb2" /> 
      </s:stroke> 
     </s:Rect> 

     <!-- tick, only shown when selected --> 
     <s:Rect includeIn="selected" width="8" height="8" horizontalCenter="0" verticalCenter="0"> 
      <s:fill> 
       <s:SolidColor color="0x90b40c" /> 
      </s:fill> 
     </s:Rect> 
    </s:Group> 
</s:GridItemRenderer> 

這是一個複選框,簡化的圖形,但你可以去從火花CheckBoxSkin搶碼和複製/粘貼到itemrenderer。只是可能需要更改一些州名。

這不會取消單行雖然當你打一個已經選定行的CheckBox,除非你持有CTRL鍵不放。這是DataGrid組件的默認行爲。如果你想阻止這種行爲,恐怕你必須創建你自己的子類DataGri

另一個重要的事情要知道:設置在itemrenderersselected屬性不會改變DataGridselectIndices。因此,在下一個commitProperties()週期中,您在渲染器中設置的值將被DataGrid覆蓋。

老答案:(編輯之前)

ItemRenderer類(因此GridItemRenderer類太)具有selected屬性。 所以,你可以selected屬性綁定的複選框的itemrenders,像這樣:

<s:CheckBox selected="{selected}" horizontalCenter="0" /> 

你必須創建一個單獨的ItemRenderer類爲實現這一目標,雖然不是內嵌一個工作。 如果您絕對想要採用內聯方式,則可以始終覆蓋selected設置器。

<s:GridItemRenderer> 
    <fx:Script> 
    <![CDATA[ 
     override public function set selected(value:Boolean):void { 
      super.selected = cb.selected = value; 
     } 
    ]]> 
    </fx:Script> 
    <s:CheckBox id="cb" horizontalCenter="0"/> 
</s:GridItemRenderer> 
+0

感謝RIAstar。將複選框的「選定」屬性綁定到GridItemRenderer可以正常工作,但相反似乎不起作用。 當我選擇它時,複選框沒有正確更新,我一次只能選擇一個複選框。 – arjunurs 2011-05-26 23:37:42

+0

我甚至嘗試過兩種方式的綁定,但它似乎不起作用:( – arjunurs 2011-05-26 23:44:59

+0

你是絕對正確的,我曾經解決過這個問題,讓我去挖掘我的代碼一秒鐘,然後我會回來一個解決方案 – RIAstar 2011-05-27 00:31:28

2

更改此:

<s:CheckBox id="cb" label="" horizontalCenter="0"/> 

要:

<s:CheckBox id="cb" label="" horizontalCenter="0" enabled="false"/> 

我只是建議你使用enabled屬性。

我覺得從checkboxgridColumn兩個派遣的「點擊事件」,然後返回功能相互阻止。

如果enabled屬性設置爲false,點擊事件dispathed只gridColumn然後使用cb.selected=grid.selectionContainsIndex(rowIndex);,如果你想顯示啓用複選框正常佔用,你可以使用CSSskinclass

1

最簡單的方法是隻使用渲染選擇如RIAStar所建議的那樣。但是,如果您正在使用全局蒙皮來執行自定義繪製不起作用,請使用可蒙皮的容器,或者我剛剛將複選框放在那裏,但不要使其響應鼠標命令。對於多重選擇,只要您的網格設置爲多行或多列,您可以簡單地捕獲鼠標事件並強制使用它們處理多重選擇的ctrl鍵。

<s:GridItemRenderer 
    mouseDown="mouseDownHandler(event)" 
    mouseUp="mouseUpHandler(event)" 
    buttonMode="true" 
    mouseChildren="false" 
    useHandCursor="true" 
    xmlns:fx="http://ns.adobe.com/mxml/2009" 
    xmlns:mx="library://ns.adobe.com/flex/mx" 
    xmlns:s="library://ns.adobe.com/flex/spark" 
    > 

    <s:states> 
     <s:State name="normal"/> 
     <s:State name="selected"/> 
    </s:states> 

    <fx:Script> 
     <![CDATA[ 
      protected function mouseUpHandler(event:MouseEvent):void { 
       event.ctrlKey = true; 
      } 

      protected function mouseDownHandler(event:MouseEvent):void { 
       event.ctrlKey = true; 
      } 
     ]]> 
    </fx:Script> 

    <s:CheckBox 
     id="check" 
     selected.normal="false" 
     selected.selected="true" 
     horizontalCenter="0" 
     verticalCenter="0" 
     /> 

</s:GridItemRenderer> 
1

最後我簡單地做這樣的:

  <s:GridColumn dataField="myBoolean" headerText="Returned" width="55"> 
       <s:itemRenderer> 
        <fx:Component> 
         <s:GridItemRenderer> 
           <s:CheckBox id="cb1" selected="{data.myBoolean}" change="{data.myBoolean=cb1.selected}"/>               
         </s:GridItemRenderer> 
        </fx:Component> 
       </s:itemRenderer> 
      </s:GridColumn>