Принудительное пересчет вертикальной полосы прокрутки в иерархическом древовидном классе, полученном из mx.controls.Tree - PullRequest
0 голосов
/ 28 июня 2011

Я работаю (за свои грехи) над проектом Flex 3.3, который, к сожалению, не может быть обновлен до более новой версии SDK на данном этапе, и столкнулся с проблемой с пользовательским классом иерархического дерева (подклассом mx.controls.Tree), который мы Используешь. Извините за орфографию; предыдущий разработчик боялся словарей ...

public class HierachyTree extends Tree

public function HierachyTree()
{
    super();
    iconFunction = itemIconFunc;
    // etc.
}

Я использую решение где-то между этими двумя методами (в основном, реализуем ITreeDataDescriptor) для добавления фильтрации живого текста к компоненту, и пока он работает :

public class HierachyTreeFilteredDataDescriptor implements ITreeDataDescriptor
{
    private var filter:Function

    public function HierachyTreeFilteredDataDescriptor(filterFunction:Function)
    {
        this.filter = filterFunction;
    }

    public function getChildren(node:Object, model:Object=null):ICollectionView
    {
        var children:ArrayCollection = new ArrayCollection([]);
        // Filter the children...
        return children;
    }

    public function hasChildren(node:Object, model:Object=null):Boolean
    {
        var treeItem:Object = node as Object;

        if (! (treeItem is ScenarioMeta)) return (treeItem as Object).children.length > 0;
        else return false;
    }

Проблема в том, что (с tree:HierachyTree) ни tree.maxVerticalScrollPosition, ни защищенное свойство tree.verticalScrollBar.maxScrollPosition не обновляются при изменении строки поиска.

Я пытался звонить invalidateList() и invalidateDisplayList() на tree - и звонить invalidateDisplayList() и invalidateSize() на tree.verticalScrollBar - безрезультатно.

Есть идеи?

Ответы [ 2 ]

1 голос
/ 06 августа 2012

У меня совершенно такая же ситуация.У меня есть необходимость отфильтровать все дерево, и я использовал решение из этих двух блогов.Пытался validateList () , validateDisplayList () , пытался вернуть новую коллекцию (не отфильтрованную) по getChildren в дескрипторе данных, но это вызвало другие проблемы.Следующее было самым простым и работало для меня лучше всего:

treeDataProvider.dispatchEvent (новый CollectionEvent (CollectionEvent.COLLECTION_CHANGE, false, false, CollectionEventKind.RESET));

0 голосов
/ 28 июня 2011

Итак, позвольте мне прямо сказать, что вы пытаетесь выполнить фильтрацию данных согласно вставленной строке поиска, которая затем должна обновить дерево?

Если это так, это довольно простоПока вы используете ArrayCollection в качестве поставщика данных для дерева:

// Check if data is ArrayCollection
var ac:ArrayCollection;
if(tree.dataProvider is ArrayCollection)
{
   ac = ArrayCollection(tree.dataProvider);
}
else if(tree.dataProvider is HierarchicalData) // Check if it's hierarchical data
{
   ac = HierarchicalData(tree.dataProvider).source as ArrayCollection;
}

// filter - specify custom filter function somewhere, look at docs on how to implement
ac.filterFunction = someFilterFunction; 
ac.refresh(); // Does the filtering and lets the tree know that it should redraw all nodes

Я думаю, вы поняли идею.Гораздо проще сделать это на основе данных.

...