Для иерархических данных вы должны использовать курсор, который перебирает все уровни иерархических данных.
var dp:IHierarchicalCollectionView = _dataGrid.hierarchicalCollectionView;
var cursor:IViewCursor= dp.createCursor();
while (!cursor.afterLast)
{
cursor.current[_dataField] = cb.selected;
cursor.moveNext();
}
Однако, это работает только с ранее открытыми узлами.Так что либо разверните все узлы с помощью _dataGrid.expandAll()
(вы можете свернуть их впоследствии, поскольку узлы нужно открывать только один раз), либо выполните итерацию ваших иерархических данных вручную:
function setCheckBoxValue(children:ArrayCollection, value:Boolean):void
{
for each (var child:Object in children)
{
if (child.hasOwnProperty("children") && child["children"])
setCheckBoxValue(child["children"], value);
child[_dataField] = value;
}
}
var myDataProvider:HierarchicalData = /* your data provider */;
// Call it like this...
setCheckBoxValue(myDataProvider.source, cb.selected);
Обновление: чтобы ответить на ваш второй вопрос.
- Создайте новый
CheckBoxColumn
, который расширяет AdvancedDataGridColumn
.Вы можете использовать его для предварительной настройки ваших headerRenderer
и itemRenderer
. - . В вашем средстве визуализации пользовательских элементов вы получите свой столбец следующим образом:
grid = AdvancedDataGrid(listData.owner);
column = grid.columns[listData.columnIndex] as CheckBoxColumn;
- Сделайте то же самое в своем заголовкеrenderer.
- Всякий раз, когда изменяется значение CheckBox в одном из ваших средств визуализации, отправляйте событие через ваш столбец.Что-то вроде:
column.dispatchEvent(new Event("checkBoxValueChanged"));
- Ваш рендер заголовка должен добавить прослушиватель событий в столбец для события "checkBoxValueChanged" (или как вы его называете).Всякий раз, когда происходит это событие, переберите вашего провайдера данных и обновите заголовки CheckBox соответственно.
Теоретически это должно работать.НТН