Получить элемент по индексу в древовидной структуре - PullRequest
2 голосов
/ 20 января 2010

Я выполняю операцию перетаскивания в дереве, используя некоторую помощь из краткого руководства Adobe: http://www.adobe.com/devnet/flex/quickstart/working_with_tree/

Предлагаемый код примерно такой:

var dropTarget:Tree = Tree(evt.currentTarget);
var i:int = dropTarget.calculateDropIndex(evt);
myTree.selectedIndex = i;
var node:XML = myTree.selectedItem as XML;
var drugXML:XML = XML(Tree(evt.dragInitiator).selectedItem);
if(node.localName() != drugXML.localName()){
    DragManager.showFeedback(DragManager.NONE);
    return;
}else{
    DragManager.showFeedback(DragManager.COPY);
}

Это все хорошо, но мне не нравится, как он выбирает (выделяет) каждый элемент дерева, на который я перетаскиваю, не совсем понятно, куда этот предмет упадет. Я хочу реализовать это без выбора, но, похоже, нет способа получить XML узла, используя только индекс. Я хотел бы что-то вроде этого:

var dropTarget:Tree = Tree(evt.currentTarget);
var i:int = dropTarget.calculateDropIndex(evt);

var node:XML = myTree.itemAt(i) as XML; 
//AFAIK itemAt(i) or anything like it does not exist

var drugXML:XML = XML(Tree(evt.dragInitiator).selectedItem);
if(node.localName() != drugXML.localName()){
    DragManager.showFeedback(DragManager.NONE);
    return;
}else{
    DragManager.showFeedback(DragManager.COPY);
}

Кто-нибудь знает, что такое функция или что я могу сделать, чтобы расширить дерево, чтобы оно имело функцию, например, "itemAt (i)"

Спасибо ~ Mike

РЕДАКТИРОВАТЬ: я забыл опубликовать, что мой текущий обходной путь устанавливает selectedIndex = -1 после того, как я получу свой узел: XML. Боюсь, что если что-то застряло на процессоре, пользователь может увидеть, что оно выбрано, а затем отмените выбор.

Ответы [ 2 ]

2 голосов
/ 21 января 2010

Гораздо проще, хотя могут быть ошибки:

var index:int = ...
var renderer:IListItemRenderer = tree.indexToItemRenderer(index);
var item:Object = renderer.data;

Это не будет работать, если индекс находится за пределами экрана (поскольку там не может быть активного itemRenderer); не должно быть проблемой для перетаскивания.

0 голосов
/ 20 января 2010

Если ваш dataProvider является явным или неявным собранием (правила преобразования приведены в связанных документах), вы можете использовать getItemAt для разрешения индекса.

Похоже, что XML провайдер будет преобразован неявно:

var tree:Tree = ...;
var data:XML = ...;
tree.dataProvider = data; // could just as well be from MXML

var provider:ICollectionView = tree.collection; // tree converted it for us
trace(provider.getItemAt(index));

Если у вас есть что-то отличное от конвертируемых типов (XML, Array и т. Д.), Вы можете подумать о том, чтобы обернуть dataProvider в XMLListCollection или что у вас есть, чтобы получить доступ к этому методу.


Вышеуказанное направлено в правильном направлении, но отсутствует.

Оказывается, вы не хотите dataProvider, так как Tree отменяет это; Вы хотите collection свойство (защищено). Таким образом, вы можете переопределить Tree и предоставить метод indexToItem для использования с thisToThat методами, уже присутствующими в Tree.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...