He estado en un proyecto urgando por aquí y por allá, para resolver la misma problemática que se presenta en esta discusión.
Tengo campos en donde se guardan caracteres en lugar de campos boleanos, pero estos valores de tipo caracter son binarios ( solo puede ser uno de 2 valores ).
De este modo en una consulta recibiremos un 1 o 0 en su representación en cadena y el componente de checkbox debe interpretar el valor para dibujar su estado.
Despues de 2 días logre crear un componente que es capaz de traducir el valor que tu especifiques mediante 2 propiedades:
1.- CheckedValue
2.- UnChecedValue
Es dichas propiedades se le especifica al componente que valor va a reconocer como el valor en alto y cual valor representa el valor en bajo.
Nota: El componente tiene un truquillo para trabajar como itemEditor en un DataGrid, porque si se necesita editar sobre el Grid, se tendra que especificar en la propiedad editorDataField la propiedad valueField.
Nota: El content asist no sugiere las propiedades del componente, no tengo más tiempo de perfeccionar el componente así que lo dejo a su disposición esperando que no lo vayan a vender.
Código ActionScript :
/**
* @autor Victor Manuel Bucio Vargas*/
import mx.controls.dataGridClasses.DataGridListData;
private var _data:Object;
private var _CheckValue:Object;
private var _UnCheckValue:Object;
//------------------------------------------------------------------------
/**
* @since Esta propiedad sirve para especificar el valor que se desea
* escribir en la propiedad del objeto cuando el valor de selected
* es true*/
public function set CheckValue(valor:Object):void
{
_CheckValue = valor;
}
//------------------------------------------------------------------------
/**
* @since Esta propiedad sirve para especificar el valor que se desea
* escribir en la propiedad del objeto cuando el valor de selected
* es false*/
public function set UnCheckValue (valor:Object):void
{
_UnCheckValue = valor;
}
//------------------------------------------------------------------------
/*public function set valueField (valor:Object):void
{
if (_data[DataGridListData(listData).dataField] is String)
{
if (selected)
_data[DataGridListData(listData).dataField] = new String(_CheckValue);
else
_data[DataGridListData(listData).dataField] = new String(_UnCheckValue);
}
else if (_data[DataGridListData(listData).dataField] is int)
{
if (selected)
_data[DataGridListData(listData).dataField] = _CheckValue;
else
_data[DataGridListData(listData).dataField] = _UnCheckValue;
}
else if ( _data[this.selectedField] is Boolean)
_data[DataGridListData(listData).dataField] = selected;
}*/
//------------------------------------------------------------------------
/**
* @since Esta propiedad de debe especificar en el editorDataField de un DataGrid
* para que el grid pueda saber de donde va a tomar el valor de la celda
* cuando se repinta la celda tras editar*/
public function get valueField ():Object
{
return _data[DataGridListData(listData).dataField];
}
//------------------------------------------------------------------------
/**
* @since Esta propiedad se encarga de recibir el objeto del cual se busca
* traducir una de sus propiedades para mostrarla en el checkbox.*/
override public function set data(valor:Object):void
{
var representa:Boolean;
//1.- Verificamos si el Check Funge como ItemRender en algun Grid
if (listData && listData is DataGridListData && DataGridListData(listData).dataField != null)
{
if (valor[DataGridListData(listData).dataField] is String)
representa = valor[DataGridListData(listData).dataField] == _CheckValue.toString();
else if (valor[DataGridListData(listData).dataField] is int)
representa = valor[DataGridListData(listData).dataField] == _CheckValue;
else if ( valor[this.selectedField] is Boolean)
representa = valor[DataGridListData(listData).dataField] as Boolean;
}
//2.- Verificamos si el componente Check funge como ItemRender en alun List (Tiene que ser boolean)
else if (listData)
{
if (selectedField)
representa = valor[selectedField];
}
//Verificamos si el Check se esta utilizando como un simple componente
else if (selectedField && valor)
{
if ( valor[selectedField] is String)
representa = valor[selectedField] == _CheckValue.toString();
else if ( valor[selectedField] is int)
representa = valor[selectedField] == _CheckValue;
else if ( valor[this.selectedField] is Boolean)
representa = valor[selectedField] as Boolean;
//representa = valor[selectedField];
}
//Se esta enviando el valor a trabajar directame el valor
else
{
if ( valor is String)
representa = valor == _CheckValue.toString();
else if ( valor is int)
representa = valor == _CheckValue;
else if ( valor[this.selectedField] is Boolean)
representa = valor as Boolean;
//representa = valor;
}
_data = valor;
this.selected = representa;
//super.dispatchEvent(new FlexEvent(FlexEvent.DATA_CHANGE));
}
//------------------------------------------------------------------------
/**
* @since Esta propiedad le devuelve el objeto actualizado al metodo que pinta
* la celda*/
override public function get data():Object
{
return _data;
}
//------------------------------------------------------------------------
/**
* @since Este evento se encarga de traducir el valor en la propiedad selected
* a la representación solicitada por el usuario*/
override protected function clickHandler(event:MouseEvent):void
{
super.clickHandler(event);
//1.- Verificamos si el Check Funge como ItemRender en algun Grid
if (listData && listData is DataGridListData && DataGridListData(listData).dataField != null)
{
if (_data[DataGridListData(listData).dataField] is String)
{
if (selected)
_data[DataGridListData(listData).dataField] = new String(_CheckValue);
else
_data[DataGridListData(listData).dataField] = new String(_UnCheckValue);
}
else if (_data[DataGridListData(listData).dataField] is int)
_data[DataGridListData(listData).dataField] = _CheckValue;
else if ( _data[this.selectedField] is Boolean)
_data[DataGridListData(listData).dataField] = selected;
}
//2.- Verificamos si el componente Check funge como ItemRender en alun List (Tiene que ser boolean)
else if (listData)
{
if (selectedField)
_data[selectedField] = selected;
}
//Verificamos si el Check se esta utilizando como un simple componente
else if (selectedField && _data)
{
if ( _data[selectedField] is String)
_data[selectedField] = selected?new String( _CheckValue) :new String(_UnCheckValue);
else if ( _data[selectedField] is int)
_data[selectedField] = selected?_CheckValue:_UnCheckValue;
else if ( _data[this.selectedField] is Boolean)
_data[selectedField] = selected;
}
//Se esta enviando el valor a trabajar directame el valor
else
{
if ( _data is String)
_data = selected? new String(_CheckValue): new String(_UnCheckValue);
else if ( _data is int)
_data = selected? _CheckValue : _UnCheckValue;
else if ( _data is Boolean)
_data = selected;
}
}
<?xml version="1.0" encoding="utf-8"?>
<mx:CheckBox xmlns:mx="http://www.adobe.com/2006/mxml" >
<mx:Script source="RichCheckBox.as" />
</mx:CheckBox>