Thanks for sharing your thoughts and examples. In my case I decided to pass in a model with a property into the renderers. The model is passed into the renderer by specifying it as a property value in the renderer class factory. The model doesn't ever get replaced after that, but the property inside the model does. I can't say any solution really strikes my fancy, but this seemed to be the most appropriate.
Again, thanks for the discussion. Aaron On Fri, Jan 8, 2010 at 9:07 AM, valdhor <[email protected]> wrote: > > > I set up a quick test bed based on your original post and using a static > variable in the renderer(s) and it worked rather well. It may not be what > you are after but I will post the example here for others that may want to > use this. > > Application: > <?xml version="1.0" encoding="utf-8"?> > <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" > layout="vertical" width="700"> > <mx:Script> > <![CDATA[ > import mx.collections.ArrayCollection; > import Renderers.CityRenderer; > import Renderers.CompanyRenderer; > > [Bindable] public var initDG:ArrayCollection = new > ArrayCollection([ > {Company: 'Acme', Contact: 'Bob Jones', Phone: '413-555-1212', > City: 'Boston', State: 'MA'}, > {Company: 'Allied', Contact: 'Jane Smith', Phone: > '617-555-3434', City: 'SanFrancisco', State: 'CA'}, > {Company: 'Acme', Contact: 'Bob Jones', Phone: '413-555-1212', > City: 'Boston', State: 'MA'}, > {Company: 'Allied', Contact: 'Jane Smith', Phone: > '617-555-3434', City: 'SanFrancisco', State: 'CA'}, > {Company: 'Acme', Contact: 'Bob Jones', Phone: '413-555-1212', > City: 'Boston', State: 'MA'}, > {Company: 'Allied', Contact: 'Jane Smith', Phone: > '617-555-3434', City: 'SanFrancisco', State: 'CA'}, > {Company: 'Acme', Contact: 'Bob Jones', Phone: '413-555-1212', > City: 'Boston', State: 'MA'}, > {Company: 'Allied', Contact: 'Jane Smith', Phone: > '617-555-3434', City: 'SanFrancisco', State: 'CA'}, > {Company: 'Acme', Contact: 'Bob Jones', Phone: '413-555-1212', > City: 'Boston', State: 'MA'}, > ]); > > private function setColors():void > { > CityRenderer.textColor = "#FF0000"; > CompanyRenderer.textColor = "#0000FF"; > initDG.refresh(); > } > > private function resetColors():void > { > CityRenderer.textColor = "#000000"; > CompanyRenderer.textColor = "#000000"; > initDG.refresh(); > } > ]]> > </mx:Script> > <mx:DataGrid id="myGrid" rowHeight="22" dataProvider="{initDG}" > rowCount="{initDG.length}"> > <mx:columns> > <mx:DataGridColumn dataField="Company" > itemRenderer="Renderers.CompanyRenderer"/> > <mx:DataGridColumn dataField="Contact"/> > <mx:DataGridColumn dataField="Phone"/> > <mx:DataGridColumn dataField="City" width="150" > itemRenderer="Renderers.CityRenderer"/> > </mx:columns> > </mx:DataGrid> > <mx:HBox> > <mx:Button label="Set Colors" click="setColors()"/> > <mx:Button label="Reset Colors" click="resetColors()"/> > </mx:HBox> > </mx:Application> > > CityRenderer.as: > package Renderers > { > import mx.controls.*; > import mx.controls.dataGridClasses.DataGridListData; > > public class CityRenderer extends Text > { > public static var textColor:String = "#000000"; > > public function CityRenderer() > { > super(); > } > > override public function set data(value:Object):void > { > super.data = value; > if(value != null) > { > text = value[DataGridListData(listData).dataField]; > } > } > > override protected function updateDisplayList(unscaledWidth:Number, > unscaledHeight:Number):void > { > super.updateDisplayList(unscaledWidth, unscaledHeight); > setStyle("color", CityRenderer.textColor); > } > } > } > > CompanyRenderer.as: > package Renderers > { > import mx.controls.*; > import mx.controls.dataGridClasses.DataGridListData; > > public class CompanyRenderer extends Text > { > public static var textColor:String = "#000000"; > > public function CompanyRenderer() > { > super(); > } > > override public function set data(value:Object):void > { > super.data = value; > if(value != null) > { > text = value[DataGridListData(listData).dataField]; > } > } > > override protected function updateDisplayList(unscaledWidth:Number, > unscaledHeight:Number):void > { > super.updateDisplayList(unscaledWidth, unscaledHeight); > setStyle("color", CompanyRenderer.textColor); > } > } > } > > > --- In [email protected], "valdhor" <valdhorli...@...> wrote: > > > > I haven't tried this so I have no idea if it would work but why not just > create a static variable inside your renderer class and change that as > required? > > > > --- In [email protected], Aaron Hardy aaronius9er@ wrote: > > > > > > I think there might be a misunderstanding. If it's a transient property > on > > > the data objects that come through the data provider, I would have to > change > > > the property for all the objects in the data provider to be the same > value > > > since I want all the renderers to change in the same way. For example, > > > let's say all my renderers say "Woot: " and then the data's text value. > > > Then at runtime, the user, in a different part of the app, enters > "Niner" > > > into a text input and therefore I want all my renderers to now say > "Niner: " > > > and then the data's text value. In my case, the word "Niner" really has > > > nothing to do with the data, it's almost more about the "style" of the > > > renderers--or what the renderers look like around the actual data. If I > > > were to use the transient property of the data provider objects, I'd > have to > > > loop through all of them and set the property's value to "Niner". I'm > not > > > sure if that's what you were suggesting, but that seems dirtier to me > than > > > referencing a separate model from the renderers. > > > > > > I'm interested in understanding your analysis of this though even if we > may > > > disagree in the end. > > > > > > Aaron > > > > > > On Thu, Jan 7, 2010 at 5:13 PM, turbo_vb TimHoff@ wrote: > > > > > > > > > > > > > > > Sure, but you don't necessarily need a model to use a VO; it can just > be > > > > the strongly typed object that the dataProvider uses for its items. > If you > > > > then change the transient properties of that VO, the set data method > of the > > > > itemRenderer will work out of the box; and you can then adjust the > renderer. > > > > You're right in feeling dirty having an itemRenderer reference a > model. But > > > > reacting to changes in the data is fine. IMHO. > > > > > > > > > > > > -TH > > > > > > > > --- In [email protected] <flexcoders%40yahoogroups.com>, > Aaron > > > > Hardy <aaronius9er@> wrote: > > > > > > > > > > Yes, I suppose the line of what is or is not a style can be blurry > at > > > > > times. In any case, using transient properties inside a VO is what > I was > > > > > eluding in the first item of "things I've thought of", the downside > being > > > > > that a model/VO of some type is needed in order to keep the > renderer > > > > > notified of updates to the property. In other words, I don't see a > viable > > > > > way of creating a "foobar" property inside the renderer and keeping > it > > > > > updated from an external source. Instead, the renderer would need > access > > > > to > > > > > a model that was set at instantiation through the renderer class > factory. > > > > > The renderer would then watch the model for changes to its "foobar" > > > > > property. > > > > > > > > > > Aaron > > > > > > > > > > On Thu, Jan 7, 2010 at 2:58 PM, turbo_vb <TimHoff@> wrote: > > > > > > > > > > > > > > > > > > > > > > > If it's a pure style, then yes that is a viable approach. > However, if > > > > it's > > > > > > something like changing text (characters, not styles), then you > might > > > > want > > > > > > to use [Transient] properties in a VO and/or use states in the > > > > itemRenderer. > > > > > > > > > > > > > > > > > > -TH > > > > > > > > > > > > --- In [email protected] <flexcoders%40yahoogroups.com > ><flexcoders% > > > > 40yahoogroups.com>, Aaron > > > > > > Hardy <aaronius9er@> wrote: > > > > > > > > > > > > > > Good point. So maybe I have to categorize everything as being > data > > > > (in > > > > > > > which case it hangs out with the data object) or style (in > which case > > > > it > > > > > > > would be applied to all the renderers and can be ran through > the > > > > various > > > > > > > style mechanisms). To be clear, the changes (that aren't > > > > data-dependent) > > > > > > > being made to the renderers in my case can even be text and > other > > > > such > > > > > > > things which may not normally be thought of as "styles" but in > > > > reality it > > > > > > > seems they actually are styles and could be treated as such. > > > > > > > > > > > > > > Thanks. > > > > > > > > > > > > > > Aaron > > > > > > > > > > > > > > On Thu, Jan 7, 2010 at 1:23 PM, turbo_vb <TimHoff@> wrote: > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > One thought, since you're taking about a style, is to assign > a > > > > > > styleName to > > > > > > > > the itemRenderer and update the backgroundColor style of the > > > > > > > > StyleDeclaration when the user changes the color. You may > need to > > > > > > override > > > > > > > > the styleChanged() method the itemRenderer, to handle the > update. > > > > > > > > > > > > > > > > -TH > > > > > > > > > > > > > > > > > > > > > > > > --- In [email protected] <flexcoders% > 40yahoogroups.com><flexcoders% > > > > 40yahoogroups.com><flexcoders% > > > > > > > > > > 40yahoogroups.com>, Aaron > > > > > > > > > > > > > > Hardy <aaronius9er@> wrote: > > > > > > > > > > > > > > > > > > Hey folks. I have a renderer that needs information that is > not > > > > based > > > > > > on > > > > > > > > > the "data" object it's associated with. Essentially what I > have > > > > is in > > > > > > > > View > > > > > > > > > A of the app is a color selector. In View B, I have a > tilelist > > > > with a > > > > > > > > > custom renderer. All the renderers in the tile list display > their > > > > > > data > > > > > > > > > using the color that was selected in Part A. The way I see > it, > > > > the > > > > > > color > > > > > > > > > selected in Part A should be kept separate from the "data" > object > > > > > > that > > > > > > > > gets > > > > > > > > > injected into the item renderers. The color is just to make > the > > > > data > > > > > > > > pretty > > > > > > > > > in some way, it's not really "data" itself nor is it > specific to > > > > an > > > > > > > > > individual data object--it applies to all renderers in the > list. > > > > This > > > > > > > > leads > > > > > > > > > me to somehow keep the renderers updated with a separate > "color" > > > > > > > > property. > > > > > > > > > What's your preferred way of handling this scenario? > > > > > > > > > > > > > > > > > > Things I've thought of so far: > > > > > > > > > > > > > > > > > > (1) If I have an application-wide model (like in Cairngorm) > I can > > > > set > > > > > > a > > > > > > > > > color property there and either access it using the > singleton > > > > accesor > > > > > > > > from > > > > > > > > > within the renderer (cringe) or pass the model into the > renderer > > > > > > using a > > > > > > > > > class factory. Since the model instance shouldn't really > ever > > > > change, > > > > > > I > > > > > > > > can > > > > > > > > > then watch the model for changes to the color property. > > > > > > > > > > > > > > > > > > (2) Whenever the color changes, I can grab all the > renderers for > > > > the > > > > > > > > given > > > > > > > > > list and set their color property (cringe). > > > > > > > > > > > > > > > > > > Thoughts? > > > > > > > > > > > > > > > > > > Aaron > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >

