Хорошо, вот как я это сделал
Первый шаг
Я создал классы SelectionIndicator, HoverIndicator и CaretIndicator, подобные тем, которые мы находим в качестве частей скина в сетке данныхskin, таким образом, часть кожи caretIndicator:
<!--- @private -->
<fx:Component id="caretIndicator">
<s:Rect implements="spark.components.gridClasses.IGridVisualElement">
<fx:Script>
<![CDATA[
import spark.components.DataGrid;
import spark.components.Grid;
/**
* @private
*/
public function prepareGridVisualElement(grid:Grid, rowIndex:int, columnIndex:int):void
{
const dataGrid:DataGrid = grid.dataGrid;
if (!dataGrid)
return;
const color:uint = dataGrid.getStyle("caretColor");
caretIndicatorFill.color = color;
}
]]>
</fx:Script>
<s:stroke>
<!--- @private -->
<s:SolidColorStroke id="caretIndicatorFill" color="0x0167FF" weight="1"/>
</s:stroke>
</s:Rect>
</fx:Component>
становится
package com.tn.zuro.components
{
import mx.graphics.SolidColorStroke;
import spark.components.DataGrid;
import spark.components.Grid;
import spark.components.gridClasses.IGridVisualElement;
import spark.primitives.Rect;
public class CaretIndicator extends Rect implements IGridVisualElement
{
private var caretIndicatorFill:SolidColorStroke ;
public function CaretIndicator()
{
super();
caretIndicatorFill = new SolidColorStroke();
this.stroke = caretIndicatorFill;
}
public function prepareGridVisualElement(grid:Grid, rowIndex:int, columnIndex:int):void
{
const dataGrid:DataGrid = grid.dataGrid;
if (!dataGrid)
return;
const color:uint = dataGrid.getStyle("caretColor");
caretIndicatorFill.color = color;
}
}
}
То же самое относится к SelectionIndicator и HoverIndicator, только не забудьте использовать SolidColor вместо solidColorStroke и заполнения свойстваили Rect вместо свойства обводки.
Второй шаг
В персонализированной сетке данных я добавил прослушиватели событий для событий gridClick, gridRollOver и gridMouseDown:
this.addEventListener(GridEvent.GRID_CLICK, gridClickHandler);
this.addEventListener(GridEvent.GRID_ROLL_OVER, gridEventHandler);
this.addEventListener(GridEvent.GRID_MOUSE_DOWN, mouse_down_handler);
А вот слушатели событий:
protected function mouse_down_handler(event:GridEvent):void
{
if (_disableFlag)
{
if (event.item)
{
if (disabledRow(event.item))
{
event.grid.caretIndicator = null;
event.grid.selectionIndicator = null;
}
}
}
}
protected function gridClickHandler(event:GridEvent):void
{
if (_disableFlag)
{
if (event.item)
{
if (!disabledRow(event.item))
{
event.grid.selectionIndicator = new ClassFactory(SelectionIndicator);
event.grid.caretIndicator = new ClassFactory(CaretIndicator);
}
}
}
}
protected function gridEventHandler(event:GridEvent):void
{
if (_disableFlag)
{
if (event.item)
{
if(disabledRow(event.item))
{
event.grid.hoverIndicator = null;
}
else
{
event.grid.hoverIndicator = new ClassFactory(HoverIndicator);
}
}
}
}
Вы, наверное, уже догадались, что _disableFlag и disabledRow соответственно являются логическим значением и функцией.Теперь последний шаг самый простой:
Третий шаг
Когда вы используете персонализированную dataGrid, если вы хотите отключить столбцы, вы устанавливаете для _disableFlag значение true и реализуетеdisabledRow, который возвращает истину, если условие выполнено, и ложь, если нет
<custom:NinjaGrid id="ninja"
_disableFlag=true
creationComplete="ninja_trainingCompleteHandler(event)"/>
protected function ninja_trainingCompleteHandler(event:FlexEvent):void
{
ninja.disabledRow = beNinja;
}
private function beNinja(ninja:Object):Boolean
{
if (ninja.knowHowToWalkOnWater == true)
return true;
return false;
}
Это решение не работает для режима выбора нескольких строк, я нашел другое решение для несколькихРежим выбора строк.
Второе решение
В этом решении я использую только компонент HoverIndicator, прослушиватель событий для события опрокидывания останется прежним.Я больше не использую прослушиватель событий для события click, и в функции mouse_down_handler у меня теперь есть этот код:
protected function mouse_down_handler(event:GridEvent):void
{
if(_disableFlag)
{
if (event.item)
{
if (!disabledRow(event.item))
{
if (!event.ctrlKey)
{
tempItem = event.item;
tempSelecteditems = new Vector.<Object>();
tempSelecteditems.push(tempItem);
}
else
{
if (tempSelecteditems.indexOf(event.item) < 0)
{
tempSelecteditems.push(event.item);
}
else
{
tempSelecteditems[tempSelecteditems.indexOf(event.item)] = null;
}
}
}
else
{
if (!event.ctrlKey)
{
selectedItem = tempItem;
tempSelecteditems = new Vector.<Object>();
}
else
{
if (tempSelecteditems.length)
{
selectedItems = tempSelecteditems;
}
else
{
selectedItem = tempItem;
}
}
}
}
}
}