我在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:HierachyTree
)tree.maxVerticalScrollPosition
和受保护的属性tree.verticalScrollBar.maxScrollPosition
在更改搜索字符串时都不会更新。
我尝试在invalidateList()
上调用invalidateDisplayList()
和tree
- 并在invalidateDisplayList()
上调用invalidateSize()
和tree.verticalScrollBar
- 无济于事。
有什么想法吗?
答案 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
我想你明白了。根据数据更容易做到这一点。