flex - La cuadrícula de datos de Spark con la casilla de verificación no se actualiza correctamente
checkbox datagrid (4)
Las casillas de verificación se actualizan correctamente cuando selecciono una o más filas de cuadrícula de datos, pero cuando selecciono una casilla de verificación por primera vez, la casilla de verificación no se actualiza hasta que el puntero sale de la fila de cuadrícula de datos. ¿Cómo puedo arreglar esto?
<?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>
Cambia esto:
<s:CheckBox id="cb" label="" horizontalCenter="0"/>
A:
<s:CheckBox id="cb" label="" horizontalCenter="0" enabled="false"/>
Solo te recomiendo usar la propiedad habilitada.
Creo que el "evento de clic" enviado desde checkbox
y gridColumn
, luego la función devuelta se impedía mutuamente.
Si la propiedad habilitada se establece como falsa, su evento click se distribuye solo en gridColumn
luego usando cb.selected=grid.selectionContainsIndex(rowIndex);
ocupe correctamente si desea mostrar la casilla de verificación activada, puede usar CSS
o skinclass
La manera más fácil es simplemente usar el estado seleccionado de renders como lo sugiere RIAStar. Sin embargo, si está utilizando el desollamiento global y el dibujo personalizado no funciona, use un contenedor que se pueda personalizar o, como acabo de poner, la casilla de verificación, pero no responda a los comandos del mouse. Para la selección múltiple, siempre que su cuadrícula esté configurada en varias filas o columnas, simplemente puede capturar los eventos del mouse y forzar la tecla ctrl que les hace manejar la selección múltiple.
<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>
Puede falsificar el CheckBox
dibujando una forma de CheckBox
en el ItemRenderer
y usar los estados para mostrar el tic.
<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>
Este es un gráfico simplificado para una casilla de verificación, pero puede ir a tomar el código de la chispa CheckBoxSkin
y copiarlo / pegarlo en el itemrenderer
lo itemrenderer
. Puede que tenga que cambiar algunos nombres de estado.
Sin embargo, esto no deseleccionará una sola fila cuando CheckBox
el CheckBox
de una fila ya seleccionada, a menos que mantengas presionada la tecla CTRL . Ese es el comportamiento predeterminado del componente DataGrid
. Me temo que tendrá que crear su propia subclase de DataGri
d si desea evitar ese comportamiento.
Otra cosa importante que debe saber: establecer la propiedad selected
en el itemrenderers
que itemrenderers
no cambia los selectIndices
de DataGrid
. Por lo tanto, en el siguiente ciclo de commitProperties()
, el valor que establezca en el renderizador quedará anulado por DataGrid
.
Respuesta anterior: (antes de editar)
La clase ItemRenderer
(y por lo tanto también la clase GridItemRenderer
) tiene una propiedad selected
. Por lo tanto, podría vincular las casillas de verificación de la propiedad selected
a los itemrenders
, de esta forma:
<s:CheckBox selected="{selected}" horizontalCenter="0" />
Tendría que crear una clase ItemRenderer
separada para que funcione, en lugar de una en línea. Si realmente desea ir en línea, siempre puede anular el establecimiento 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>
Terminé simplemente haciendo esto:
<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>