My rule is: don't use Bindable unless you absolutely need it.  It adds
overhead to your application.  You'll get warning if you try to bind to
something that isn't bindable and then you can decide how to deal with
it.

 

I use [Bindable] in prototypes, but I would use it more sparingly in
real apps.  In the framework, we always use [Bindable(event=...)] so we
have full control over all the code.  If you did that, then you have to
write more code, but you can fully see what is running and opt-in to
having change detection or not.

 

________________________________

From: flexcoders@yahoogroups.com [mailto:[EMAIL PROTECTED] On
Behalf Of j_lentzz
Sent: Wednesday, January 02, 2008 11:02 AM
To: flexcoders@yahoogroups.com
Subject: [flexcoders] Re: Datagrid Renderer not showing updated
ArrayCollection

 

Thank You! That fixed it. Are there 'rules' to follow about when/if
things need to be bindable? I've been using the [Bindable] tag pretty
often. Should I not use it until it seems like something is not working?

Thanks again,

John
--- In flexcoders@yahoogroups.com <mailto:flexcoders%40yahoogroups.com>
, "Alex Harui" <[EMAIL PROTECTED]> wrote:
>
> Try removing [Bindable] from the data setter. I don't see where you
are
> using it, and it autogenerates change detection logic that may prevent
> your setter from running since the comparision is done by reference
> 
> 
> 
> ________________________________
> 
> From: flexcoders@yahoogroups.com <mailto:flexcoders%40yahoogroups.com>
[mailto:flexcoders@yahoogroups.com <mailto:flexcoders%40yahoogroups.com>
] On
> Behalf Of j_lentzz
> Sent: Wednesday, January 02, 2008 10:44 AM
> To: flexcoders@yahoogroups.com <mailto:flexcoders%40yahoogroups.com> 
> Subject: [flexcoders] Re: Datagrid Renderer not showing updated
> ArrayCollection
> 
> 
> 
> Here is the code for the renderer. I extend Label and add a
> dataProvider to make it act like a combobox, so that I can specify an
> index to show. That way it doesn't look like a combobox when it
> renders. I'm not doing anything special to look for a change, just
> implementing what I thought was necessary.
> 
> public class LabelWithDownArrow extends Label
> {
> 
> private var _dataProvider:ArrayCollection = null;
> 
> private var _prompt:String = null;
> private var defaultPrompt:String = "Select Item...";
> private var _selectedIndex:int = -1;
> 
> public function LabelWithDownArrow()
> {
> super();
> }
> 
> public function set dataProvider(value:ArrayCollection):void {
> _dataProvider = value;
> }
> 
> public function get dataProvider():ArrayCollection {
> return _dataProvider;
> }
> 
> public function set selectedIndex(value:int):void {
> _selectedIndex = value;
> }
> 
> public function get selectedIndex():int {
> return _selectedIndex;
> }
> 
> public function set prompt(value:String):void {
> _prompt = value;
> }
> 
> public function get prompt():String {
> return _prompt;
> }
> 
> override protected function updateDisplayList(w:Number, h:Number):void
{
> super.updateDisplayList(w-15, h); // subtract from width to allow
> for down arrow
> 
> var g:Graphics = graphics;
> 
> g.clear();
> 
> // add arrow to box
> // Draw the triangle.
> g.beginFill(0x000000); // black
> g.moveTo(w - 11.5, h / 2 + 3);
> g.lineTo(w - 15, h / 2 - 2);
> g.lineTo(w - 8, h / 2 - 2);
> g.lineTo(w - 11.5, h / 2 + 3);
> g.endFill();
> }
> 
> // method used to change what is displayed
> [Bindable]
> override public function set data(value:Object):void {
> super.data = value;
> 
> if (listData != null && dataProvider != null) { 
> 
> // now iterate through dp to find a matching data value, when
> found put its label in the Label widget 
> var dpLen:int = dataProvider.length;
> for (var j:int=0; j<dpLen; j++) {
> if (dataProvider.getItemAt(j).data ==
> data[DataGridListData(listData).dataField]) { // found match
> this.text = dataProvider.getItemAt(j).label; // + " " +
> dp.getItemAt(j).data;
> trace('found LabelWithDownArrow');
> return;
> }
> }
> 
> // not found, so show comboBox prompt
> if (prompt == null || prompt == "-1" || selectedIndex == -1)
> this.text = defaultPrompt;
> else if (selectedIndex < dataProvider.length)
> this.text = dataProvider.getItemAt(selectedIndex).label;
> else
> this.text = "";
> 
> trace('not found LabelWithDownArrow');
> }
> }
> 
> }
> 
> --- In flexcoders@yahoogroups.com
<mailto:flexcoders%40yahoogroups.com>
<mailto:flexcoders%40yahoogroups.com>
> , "Alex Harui" <aharui@> wrote:
> >
> > What does the renderer look like? How will it detect changes to the
> > underlying data?
> > 
> > 
> > 
> > ________________________________
> > 
> > From: flexcoders@yahoogroups.com
<mailto:flexcoders%40yahoogroups.com>
<mailto:flexcoders%40yahoogroups.com>
> [mailto:flexcoders@yahoogroups.com
<mailto:flexcoders%40yahoogroups.com>
<mailto:flexcoders%40yahoogroups.com>
> ] On
> > Behalf Of j_lentzz
> > Sent: Wednesday, January 02, 2008 7:21 AM
> > To: flexcoders@yahoogroups.com <mailto:flexcoders%40yahoogroups.com>
<mailto:flexcoders%40yahoogroups.com> 
> > Subject: [flexcoders] Datagrid Renderer not showing updated
> > ArrayCollection
> > 
> > 
> > 
> > Hi,
> > 
> > I've got a datagrid with a custom renderer. I'm not editing in the
> > datagrid, but when a row is selected, I populate some TextInputs and
> > ComboBoxes to let them edit the data. When they are done, I use
> > itemUpdated on the datagrid ArrayCollection. This seems to work just
> > fine. However, after they edit the data, it isn't being updated in
> > the datagrid. I can select a different row, then select the original
> > row and the new data appears in the edit locations, but only the old
> > data is displayed in the datagrid. I've tried all the invalidateXXX
> > methods I could find, but nothing seems to get the datagrid do
display
> > the new data. Also, I can set a breakpoint, examine the
> > arraycollection the datagrid uses, and the correct data is present -
> > just not being displayed. What do I need to do to get the datagrid
to
> > be forced to used the arraycollection and update all the
> > itemrenderers? I'm using 2.01, would Flex 3 be better?
> > 
> > Thanks,
> > 
> > John
> >
>

 

Reply via email to