2010-02-09 2 views
2

У меня есть элемент управления деревом, и после того, как я опускаю элемент в нем (который обновляет датаподаватель), я хочу, чтобы он оставался открытым. Я пробовал много вещей, включая пример в this question, который я не мог заставить работать, поэтому я делаю то, что я чувствую, еще более основательно. Например:Flex Tree не перерасширяется

[Bindable] 
public var open:Object = new Object(); 

private function dropItemInTree():void{ 
    open = myTree.openItems; 
    //A bunch of code that updates the DP 
    reopenTree(); 
} 

public function reopenTree():void{ 
    for each(var item:XML in open){ 
     expandParents(item[0]); 
    } 
} 

private function expandParents(node:XML):void { 
    myTree.expandItem(node,true,false); 
} 

Но даже это оставляет мое дерево минимальным. Что случилось?

+0

XMLTree1.expandItem (MailBox.getItemAt (0), правда, ложь, правда); Его четвертый параметр. Установите его, и ваш код должен работать. См. Мой ответ ниже для более подробной информации. –

+0

Четвертый параметр предназначен только для отправки события itemOpen при запуске метода expandItem. В этом случае я даже не могу открыть один элемент с помощью метода expandItem, поэтому отключение и привязка событий к этому событию тоже не сработают. – invertedSpear

ответ

3

Так что я, наконец, понял, что происходит. В моей функции drop я в основном восстанавливал весь DP. Хотя это было почти то же самое, у него было бы разное UID внутри flash-плеера, поэтому объекты в открытом var больше не ссылались на объекты в DP. К счастью, в моем XML-dataprovider есть поле ID, поэтому я смог найти объект в восстановленном DP и, наконец, получить там метод expandItem.

Так что мой вновь открыть функция теперь выглядит вроде как это:

public function renderTree():void 
    for each(var item:XML in open){ 
     myTree.expandItem(XML(MyDP..node.(@attr == [email protected])),true); 
     //forcing the type to be XML is VITAL 
    } 
} 
1

Извините, вот полное объяснение: ссылка внизу дает полное объяснение вместе с полным образцом.

Вы должны использовать событие createCallate управления Tree, а не событие initialize, поскольку поставщик данных не полностью инициализирован и доступен до события creationComplete.

<mx:Tree id="tree1" ... creationComplete="initTree();" > 

ИЛИ

вы можете также получить коробку openItems, чтобы указать начальную открытую позицию, установив метод expandItem() отправляет событие itemOpen. Это можно сделать, указав четвертый необязательный параметр метода expandItem() в значение true. Истинный четвертый параметр заставляет дерево отправлять открытое событие при открытии элемента. В следующем примере показано использование четвертого параметра:

XMLTree1.expandItem(MailBox.getItemAt(0), true, false, true); 

По умолчанию управления Tree сжимают при инициализации, но вы можете инициализировать его так, что она расширяется с конкретным узлом, выбранным.

<mx:Script> 
    <![CDATA[ 
     import flash.events.*; 
     import mx.events.*; 
     import mx.controls.*; 
     private function initTree():void { 

      XMLTree1.expandItem(MailBox.getItemAt(0), true); 
      XMLTree1.selectedIndex = 2; 
     } 
    ]]> 
</mx:Script> 

Ссылка для контроля дерева является: http://livedocs.adobe.com/flex/3/html/help.html?content=dpcontrols_8.html

+0

Мой код должен расширять дерево, точно так же, как в этом примере. Я использую тот же метод expandItem, но для моего дерева это не работает, и я не знаю почему. – invertedSpear

+0

Проблема с этим примером заключается в том, что мое дерево уже создано, поэтому мне не нужно беспокоиться о создании полного или что-то еще. Метод expandItem должен работать, но это не так (он работает в функции двойного щелчка, которую я написал, чтобы открыть выбранный узел). Почему это не работает, когда я перебираю открытый массив? – invertedSpear

+0

, хотя моя проблема была немного более абстрактной, чем то, что показывает этот пример. Я даю вам голосование, потому что любой, у кого есть проблема, подобная моей, должен сначала понять этот пример. – invertedSpear

Смежные вопросы