I know this is an old thread, but for those who come across this in the future, this is a great article that sums up the problem and solutions quite well:
http://www.adobe.com/devnet/flex/articles/itemrenderers_pt3_02.html Aaron On Fri, Jan 8, 2010 at 10:47 PM, Aaron Hardy <[email protected]> wrote: > 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 >> > > > > > > > > >> > > > > > > > >> > > > > > > > >> > > > > > > > >> > > > > > > >> > > > > > >> > > > > > >> > > > > > >> > > > > >> > > > >> > > > >> > > > >> > > >> > >> >> > >

