<!--header-->
<?xml version="1.0" encoding="utf-8"?>
<mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml" width="100%" height="100%" horizontalAlign="center" preinitialize="init()" implements="mx.core.IFactory">
<mx:Script>
<![CDATA[
import common.checkbox.events.SimpleHeaderClickEvent;
import mx.controls.DataGrid;
import mx.binding.utils.BindingUtils;
//will be set by "properties" property of ClassFactory
//allows us to bind to an external value while remaining decoupled
public var externalObject:*;
public var externalPropertyName:String;
public var dataGridObject:DataGrid;
//local property that will be bound to external value held in externalObject[externalPropertyName]
//CheckBox's selected property in turn bound to this
[Bindable]
public var isSelected:Boolean = false;
//method required by IFactory
public function newInstance():*{
return new GenericCheckBoxHeaderRenderer();
}
//set up binding of local property to value specified by ClassFactory::properties
private function init():void{
BindingUtils.bindProperty(this,"isSelected",externalObject,externalPropertyName);
this.parentApplication.addEventListener(SimpleHeaderClickEvent.EXT_CLICK,function(event:SimpleHeaderClickEvent):void{
event.cb = t_cb;
event.itemObjectList = dataGridObject.dataProvider;
event.cb.selected = event.allSelected;
onClick(new MouseEvent(MouseEvent.CLICK));
});
}
//local click handler that dispatches the event
//so it can be handled in a more appropriate place (such as the document holding the DataGrid)
public function onClick(event:MouseEvent):void{
var evt:SimpleHeaderClickEvent = new SimpleHeaderClickEvent(SimpleHeaderClickEvent.CLICK,
t_cb,dataGridObject.dataProvider);
onHeaderClick(evt);
// 将checkbox状态改变的事件通知出去
dispatchEvent(evt);
}
//单击DataGridHeader事件
private function onHeaderClick(event:SimpleHeaderClickEvent):void{
//更新属性
isSelected = externalObject.allSelected = event.cb.selected;
var theData:* = dataGridObject.dataProvider;
if(theData != null){
for each(var resultObj:* in theData){
resultObj.isSelected = isSelected;
}
theData.refresh();
}
}
]]>
</mx:Script>
<mx:CheckBox id="t_cb" click="onClick(event)" selected="{isSelected}" width="15"/>
</mx:HBox>
<!--Item -->
<?xml version="1.0" encoding="utf-8"?>
<mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml" width="100%" height="100%" horizontalAlign="center"
implements="mx.core.IFactory" preinitialize="init()">
<mx:Script>
<![CDATA[
import common.checkbox.events.SimpleItemClickEvent;
import mx.controls.DataGrid;
import mx.charts.renderers.BoxItemRenderer;
import mx.controls.dataGridClasses.DataGridColumn;
/**
* 该checkbox的惟一标识的名字
*/
public var dnField:*;
//name of property on our VO we're concerned with
public var dataField:String;
// DataGrid
public var dataGridObject:DataGrid;
//method required by IFactory
public function newInstance():*{
return new GenericCheckBoxItemRenderer();
}
private function init():void{
// 监视外部命令
this.parentApplication.addEventListener(SimpleItemClickEvent.EXT_CLICK,function(event:SimpleItemClickEvent):void{
var dn:* = data[dnField];
if(dn != null && dn == event.dn){
// event.stopImmediatePropagation();
t_cb.selected = true;
onClick(new MouseEvent(MouseEvent.CLICK));
}
});
}
//this override is essential for preventing random (un)checking when your DataGrid is scrolled
override public function set data(value:Object):void{
//not sure of the details on when or why, but sometimes this method is passed a null value
if(value != null) {
super.data = value;
//the parent DataGridColumn is passed as value before the real data arrives
if(!(value is DataGridColumn)){
//set itemRenderer's state based on the value held in the property specified by _dataField
t_cb.selected = value[dataField];
}
var evt:SimpleItemClickEvent = new SimpleItemClickEvent(SimpleItemClickEvent.DATA_INIT,super.data,dataField,t_cb);
// 将checkbox状态初始化的事件通知出去
dispatchEvent(evt);
}
}
//local click handler that dispatches the event
//so it can be handled in a more appropriate place (such as the document holding the DataGrid)
private function onClick(event:MouseEvent):void{
//attach our VO and _dataField onto the event so that it can be manipulated in the handler
//wherever that handler may be
var evt:SimpleItemClickEvent = new SimpleItemClickEvent(SimpleItemClickEvent.CLICK,super.data,dataField);
super.data[dataField] = t_cb.selected;
// 将checkbox状态改变的事件通知出去
dispatchEvent(evt);
}
//捕获单击DataGrid's itemRenderer中的CheckBox事件
/*private function onItemClick(event:SimpleItemClickEvent):void{
//创建当前点击的GenericCheckBoxItemRenderer对象
var ir:GenericCheckBoxItemRenderer = event.target as GenericCheckBoxItemRenderer;
var cb:CheckBox = ir.t_cb as CheckBox;
//更新对象属性值成CheckBox选择装态
event.itemObject[event.itemPropName] = cb.selected;
if(callbackFun != null){
callbackFun(event);
}
}*/
]]>
</mx:Script>
<mx:CheckBox id="t_cb" click="onClick(event)" width="15"/>
</mx:HBox>
<!--headerEvent -->
package common.checkbox.events
{
import flash.events.Event;
import mx.controls.CheckBox;
//simple event that can hold a Person and a property name
public class SimpleHeaderClickEvent extends Event
{
public static var CLICK:String = "checkBoxHeaderClick";
public static var EXT_CLICK:String = "checkExtBoxHeaderClick";
// Checkbox对象
public var cb:CheckBox;
// 数据源
public var itemObjectList:*;
//Select
public var allSelected:Boolean;
public function SimpleHeaderClickEvent(type:String, cb:CheckBox, itemObjectList:*){
super(type,true,true);
this.cb = cb;
this.itemObjectList = itemObjectList;
}
}
}
<!--ItemEvent -->
package common.checkbox.events
{
import flash.events.Event;
import mx.controls.CheckBox;
//simple event that can hold a Person and a property name
public class SimpleHeaderClickEvent extends Event
{
public static var CLICK:String = "checkBoxHeaderClick";
public static var EXT_CLICK:String = "checkExtBoxHeaderClick";
// Checkbox对象
public var cb:CheckBox;
// 数据源
public var itemObjectList:*;
//Select
public var allSelected:Boolean;
public function SimpleHeaderClickEvent(type:String, cb:CheckBox, itemObjectList:*){
super(type,true,true);
this.cb = cb;
this.itemObjectList = itemObjectList;
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml" width="100%" height="100%" horizontalAlign="center" preinitialize="init()" implements="mx.core.IFactory">
<mx:Script>
<![CDATA[
import common.checkbox.events.SimpleHeaderClickEvent;
import mx.controls.DataGrid;
import mx.binding.utils.BindingUtils;
//will be set by "properties" property of ClassFactory
//allows us to bind to an external value while remaining decoupled
public var externalObject:*;
public var externalPropertyName:String;
public var dataGridObject:DataGrid;
//local property that will be bound to external value held in externalObject[externalPropertyName]
//CheckBox's selected property in turn bound to this
[Bindable]
public var isSelected:Boolean = false;
//method required by IFactory
public function newInstance():*{
return new GenericCheckBoxHeaderRenderer();
}
//set up binding of local property to value specified by ClassFactory::properties
private function init():void{
BindingUtils.bindProperty(this,"isSelected",externalObject,externalPropertyName);
this.parentApplication.addEventListener(SimpleHeaderClickEvent.EXT_CLICK,function(event:SimpleHeaderClickEvent):void{
event.cb = t_cb;
event.itemObjectList = dataGridObject.dataProvider;
event.cb.selected = event.allSelected;
onClick(new MouseEvent(MouseEvent.CLICK));
});
}
//local click handler that dispatches the event
//so it can be handled in a more appropriate place (such as the document holding the DataGrid)
public function onClick(event:MouseEvent):void{
var evt:SimpleHeaderClickEvent = new SimpleHeaderClickEvent(SimpleHeaderClickEvent.CLICK,
t_cb,dataGridObject.dataProvider);
onHeaderClick(evt);
// 将checkbox状态改变的事件通知出去
dispatchEvent(evt);
}
//单击DataGridHeader事件
private function onHeaderClick(event:SimpleHeaderClickEvent):void{
//更新属性
isSelected = externalObject.allSelected = event.cb.selected;
var theData:* = dataGridObject.dataProvider;
if(theData != null){
for each(var resultObj:* in theData){
resultObj.isSelected = isSelected;
}
theData.refresh();
}
}
]]>
</mx:Script>
<mx:CheckBox id="t_cb" click="onClick(event)" selected="{isSelected}" width="15"/>
</mx:HBox>
<!--Item -->
<?xml version="1.0" encoding="utf-8"?>
<mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml" width="100%" height="100%" horizontalAlign="center"
implements="mx.core.IFactory" preinitialize="init()">
<mx:Script>
<![CDATA[
import common.checkbox.events.SimpleItemClickEvent;
import mx.controls.DataGrid;
import mx.charts.renderers.BoxItemRenderer;
import mx.controls.dataGridClasses.DataGridColumn;
/**
* 该checkbox的惟一标识的名字
*/
public var dnField:*;
//name of property on our VO we're concerned with
public var dataField:String;
// DataGrid
public var dataGridObject:DataGrid;
//method required by IFactory
public function newInstance():*{
return new GenericCheckBoxItemRenderer();
}
private function init():void{
// 监视外部命令
this.parentApplication.addEventListener(SimpleItemClickEvent.EXT_CLICK,function(event:SimpleItemClickEvent):void{
var dn:* = data[dnField];
if(dn != null && dn == event.dn){
// event.stopImmediatePropagation();
t_cb.selected = true;
onClick(new MouseEvent(MouseEvent.CLICK));
}
});
}
//this override is essential for preventing random (un)checking when your DataGrid is scrolled
override public function set data(value:Object):void{
//not sure of the details on when or why, but sometimes this method is passed a null value
if(value != null) {
super.data = value;
//the parent DataGridColumn is passed as value before the real data arrives
if(!(value is DataGridColumn)){
//set itemRenderer's state based on the value held in the property specified by _dataField
t_cb.selected = value[dataField];
}
var evt:SimpleItemClickEvent = new SimpleItemClickEvent(SimpleItemClickEvent.DATA_INIT,super.data,dataField,t_cb);
// 将checkbox状态初始化的事件通知出去
dispatchEvent(evt);
}
}
//local click handler that dispatches the event
//so it can be handled in a more appropriate place (such as the document holding the DataGrid)
private function onClick(event:MouseEvent):void{
//attach our VO and _dataField onto the event so that it can be manipulated in the handler
//wherever that handler may be
var evt:SimpleItemClickEvent = new SimpleItemClickEvent(SimpleItemClickEvent.CLICK,super.data,dataField);
super.data[dataField] = t_cb.selected;
// 将checkbox状态改变的事件通知出去
dispatchEvent(evt);
}
//捕获单击DataGrid's itemRenderer中的CheckBox事件
/*private function onItemClick(event:SimpleItemClickEvent):void{
//创建当前点击的GenericCheckBoxItemRenderer对象
var ir:GenericCheckBoxItemRenderer = event.target as GenericCheckBoxItemRenderer;
var cb:CheckBox = ir.t_cb as CheckBox;
//更新对象属性值成CheckBox选择装态
event.itemObject[event.itemPropName] = cb.selected;
if(callbackFun != null){
callbackFun(event);
}
}*/
]]>
</mx:Script>
<mx:CheckBox id="t_cb" click="onClick(event)" width="15"/>
</mx:HBox>
<!--headerEvent -->
package common.checkbox.events
{
import flash.events.Event;
import mx.controls.CheckBox;
//simple event that can hold a Person and a property name
public class SimpleHeaderClickEvent extends Event
{
public static var CLICK:String = "checkBoxHeaderClick";
public static var EXT_CLICK:String = "checkExtBoxHeaderClick";
// Checkbox对象
public var cb:CheckBox;
// 数据源
public var itemObjectList:*;
//Select
public var allSelected:Boolean;
public function SimpleHeaderClickEvent(type:String, cb:CheckBox, itemObjectList:*){
super(type,true,true);
this.cb = cb;
this.itemObjectList = itemObjectList;
}
}
}
<!--ItemEvent -->
package common.checkbox.events
{
import flash.events.Event;
import mx.controls.CheckBox;
//simple event that can hold a Person and a property name
public class SimpleHeaderClickEvent extends Event
{
public static var CLICK:String = "checkBoxHeaderClick";
public static var EXT_CLICK:String = "checkExtBoxHeaderClick";
// Checkbox对象
public var cb:CheckBox;
// 数据源
public var itemObjectList:*;
//Select
public var allSelected:Boolean;
public function SimpleHeaderClickEvent(type:String, cb:CheckBox, itemObjectList:*){
super(type,true,true);
this.cb = cb;
this.itemObjectList = itemObjectList;
}
}
}