在从mx.controls.Tree派生的分层树类中强制垂直滚动条重新计算

时间:2011-06-28 15:18:54

标签: flex actionscript flex3

我在Flex 3.3项目上工作(我的罪过),遗憾的是在这个阶段无法升级到更新的SDK版本,并且遇到了自定义分层树类的问题(子类mx.controls.Tree我们正在使用。 原谅拼写;以前的开发人员害怕字典......

public class HierachyTree extends Tree

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

我正在这些two methods之间使用解决方案(基本上是实现ITreeDataDescriptor),以便为组件添加实时文本过滤,并且它到目前为止工作:< / p>

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:HierachyTreetree.maxVerticalScrollPosition和受保护的属性tree.verticalScrollBar.maxScrollPosition在更改搜索字符串时都不会更新。

我尝试在invalidateList()上调用invalidateDisplayList()tree - 并在invalidateDisplayList()上调用invalidateSize()tree.verticalScrollBar - 无济于事。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

我的情况完全相同。我需要过滤整个树,我确实使用了这两个博客的解决方案。 尝试 validateList() validateDisplayList(),尝试在数据描述符中的getChildren上返回一个新集合(未过滤),但这导致了其他问题。 以下是最简单的,最适合我的工作:

  

treeDataProvider.dispatchEvent(新   CollectionEvent(CollectionEvent.COLLECTION_CHANGE,false,false,   CollectionEventKind.RESET));

答案 1 :(得分:0)

所以,让我直截了当地说,你要完成的是根据插入的搜索字符串过滤数据,然后刷新树?

如果是这种情况,只要您使用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

我想你明白了。根据数据更容易做到这一点。