我有一个带有复选框的树形控件,它使用来自http://www.sephiroth.it/file_detail.php?id=151#的控件
不知何故,当我更改dataProvider时(即通过单击复选框),我无法让控件更新,我可以让它更新的唯一方法是使用滚动条.如何强制更新?我已经尝试过所有可能的方法了吗?(见下面的更新)
另外我如何重置树(拼写所有节点,滚动到大树顶部)?
package offerta.monkeywrench.components { import offerta.monkeywrench.components.componentClasses.TreeCheckBoxItemRenderer; import mx.collections.ArrayCollection; import mx.events.TreeEvent; public class WatchTree extends TreeCheckBox { public var idProperty:String; public var watchFactory:Function; private var _wSet:Boolean = false; /* clientId: */ private var _clientId:String; [Bindable] public function get clientId():String { return _clientId; } public function set clientId(value:String):void { this._clientId = value; } /* //clientId */ /* watching: */ private var _watching:ArrayCollection; [Bindable] public function set watching(value:ArrayCollection):void { this._watching = value; } public function get watching():ArrayCollection { return this._watching; } /* //watching */ override public function initialize() :void { super.initialize(); addEventListener("itemCheck", onItemCheck, false, 0, true); } private function isWatching(id:String):Boolean { for each(var w:Object in this._watching) { if(w[this.idProperty]==id) return true; } return false; } private function onItemCheck(event:TreeEvent):void { var item:Object = event.item as Object; var currentValue:uint = (event.itemRenderer as TreeCheckBoxItemRenderer).checkBox.checkState; if(item.children==null) { currentValue==2 ? addWatch(item.Id) : removeWatch(item.Id); } else { for each(var x:Object in item.children) { currentValue==2 ? addWatch(x.Id) : removeWatch(x.Id); } } updateParents(item, currentValue); updateChilds(item, currentValue); this.dataProvider.refresh(); super.invalidateProperties(); super.invalidateDisplayList(); super.updateDisplayList(this.unscaledWidth, this.unscaledHeight); } private function updateParents(item:Object, value:uint):void { var checkValue:String = (value == ( 1 << 1 | 2 << 1 ) ? "2" : value == ( 1 << 1 ) ? "1" : "0"); var parentNode:Object = item.parent; if(parentNode) { for each(var x:Object in parentNode.children) { if(x.checked != checkValue) { checkValue = "2" } } parentNode.checked = checkValue; updateParents(parentNode, value); } } private function updateChilds(item:Object, value:uint):void { var middle:Boolean = (value&2<<1)==(2<<1); if(item.children!=null && item.children.length>0&&!middle) { for each(var x:Object in item.children) { x.checked = value == (1<<1|2<<1) ? "2" : value==(1<<1) ? "1" : "0"; updateChilds(x, value); } } } private function addWatch(id:String):void { if(isWatching(id)) return; this._watching.addItem(this.watchFactory(id, this.clientId)); } private function removeWatch(id:String):void { for(var i:int=0, n:int=this._watching.length; i
inferis.. 20
我发现Tree控件在Flex中有点敏感.我最终强制重绘的方法是断开dataProvider并重新连接它,然后强制验证,有点像这样:
private function forceRedraw(tree:Tree, dataProvider:Object):void { var scrollPosition:Number = tree.verticalScrollPosition; var openItems:Object = tree.openItems; tree.dataProvider = dataProvider; tree.openItems = openItems; tree.validateNow(); tree.verticalScrollPosition = scrollPosition; }我想这会顺便回答你问题的第二部分,因为你所要做的就是将openItems集合归零并将verticalScrollPosition设置为0.
1> inferis..:我发现Tree控件在Flex中有点敏感.我最终强制重绘的方法是断开dataProvider并重新连接它,然后强制验证,有点像这样:
private function forceRedraw(tree:Tree, dataProvider:Object):void { var scrollPosition:Number = tree.verticalScrollPosition; var openItems:Object = tree.openItems; tree.dataProvider = dataProvider; tree.openItems = openItems; tree.validateNow(); tree.verticalScrollPosition = scrollPosition; }我想这会顺便回答你问题的第二部分,因为你所要做的就是将openItems集合归零并将verticalScrollPosition设置为0.