Well, that's really unfortunate, as I'm trying to deliver an application based on Flex 2 that has this behavior. I'm going to try hacking something together to save/restore the tree layout after resetting the dataprovider. If anyone else has any suggestions, I'd really appreciate them.
On Nov 28, 2007 11:38 AM, Alex Harui <[EMAIL PROTECTED]> wrote: > Tree doesn't really support sorting. We hope to provide an example in > 3.0 of how to get Tree to handle sorting > > ------------------------------ > *From:* [email protected] [mailto:[EMAIL PROTECTED] *On > Behalf Of *Pan Troglodytes > *Sent:* Wednesday, November 28, 2007 8:27 AM > *To:* flexcoders > *Subject:* [flexcoders] a tree that keeps sorted > > I'm trying to build a tree (Flex 2) that keeps its nodes sorted, even > when you edit them. I keep running into problems, though. Here's the basic > app, without the auto-sorting: > > <?xml version="1.0" encoding="utf-8"?> > <mx:Application xmlns:mx=" http://www.adobe.com/2006/mxml" > layout="vertical" creationComplete="creationComplete()"> > <mx:Script> > <![CDATA[ > import mx.collections.SortField; > import mx.collections.Sort; > import mx.collections.ArrayCollection ; > > [Bindable] private var treedata:ArrayCollection = > new ArrayCollection([ > {label:"node0"}, > {label:"node1"}, > {label:"node2"}, > {label:"node3"}, > {label:"node4"} > ]); > > private function creationComplete():void > { > var sort:Sort = new Sort; > sort.fields = [new SortField("label", true)]; > treedata.sort = sort; > } > ]]> > </mx:Script> > <mx:Tree > id="tree" > dataProvider="{treedata}" > width="200" > editable="true" > /> > </mx:Application> > > > Okay, so that lets you click on the nodes and edit them. What should be > done to get the nodes to re-sort after editing? I've tried: > > itemEditEnd="treedata.refresh()" > > Doesn't work, because when itemEditEnd has been called, the dataprovider > hasn't actually been updated. > > itemEditEnd="callLater(treedata.refresh, [])" > > Sorta works, until renamed "node2" to "node" and then it just disappears. > If you rename the last node to something that would make it the first node, > you get an error. > > private function reload():void > { > treedata.refresh(); > tree.dataProvider = treedata; > } > > itemEditEnd="callLater(reload)" > > This works ok, until you have a node with children like: > {label:"node0", children:new ArrayCollection([{label:"child-0-1"}, > {label:"child-0-2"}])}, > And you expand it before renaming "node4" to "node". Then you get an > error. > > I've also tried this without using itemEditEnd and instead having the node > be a custom object that throws events. I run into the same issues. What's > the "right" way to do something that should be a pretty simple task? > > -- > Jason > > -- Jason

