Hi,
 Thanks a lot, Josh. That example cleared my doubt. Also, I believe in
the case where my dataProvider does not contain elements with Bindable
properties, I just need to call dataProvider.refresh() to update the
datagrid.
Thanks once again.
Regards,
Gaurav


--- In [email protected], "Josh McDonald" <[EMAIL PROTECTED]> wrote:
>
> If you have:
> 
> var myList : ArrayCollection = new ArrayCollection();
> 
> And it's not bindable, but points to objects that are, then a
component that
> has it as a dataProvider will update when you add an item, or remove an
> item, or change an item. But, since the "myList" variable itself is not
> bindable, you could do this:
> 
> myList = new ArrayCollection();
> 
> And there'd be no update, and myDatagrid.dataProvider would still
point to
> the old ArrayCollection.
> 
> -J
> 
> On Mon, May 19, 2008 at 7:02 PM, gaurav1146 <[EMAIL PROTECTED]> wrote:
> 
> >   Hi,
> > Thanks, I now get that addItem method was responsible for triggering
> > the property change event. But I am not very clear what purpose does
> > it serve to have the dataProvider as Bindable. Based on your example I
> > created a class Company and used an Arraycollection companyList to
> > display companies in the datagrid. It did not matter whether the
> > companyList was Bindable or not. All that was required was that the
> > name property of Company should be Bindable. Also for a list
> > containing Object the value of the datagrid was not updated if any
> > object property was changed irrespective of whether the list is
> > Bindable or not.
> > The thing is that if I do not set the dataprovider as Bindable
> > I get a warning that Data Binding would not be able to detect
> > assignments to the dataProvider. I would be grateful if you could
> > point me to a scenario where declaring the dataProvider as Bindable
> > makes a difference. Would it be in cases like where I use something
> > like dataGrid2.dataProvider = {dataGrid1.dataProvider}.
> >
> > Following is the modified code that I tried out:
> >
> >
> > <?xml version="1.0" encoding="utf-8"?>
> > <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml";
> > layout="absolute" initialize="createCompanies()">
> > <mx:Script>
> > <![CDATA[
> > import mx.collections.ArrayCollection;
> > [Bindable]
> > public var dp:ArrayCollection = new
> > ArrayCollection([{index:1,word:"Test1"},{index:2, word:"Test2"}]);
> > public var companyList:ArrayCollection = new ArrayCollection();
> >
> > /*
> > * Does not work as the word property in Object is not bindable
> > */
> > public function changeDataProvider():void
> > {
> > var obj:Object = dp.getItemAt(0);
> > obj["word"] = "Modified Test";
> > }
> >
> > public function createCompanies():void{
> > var c1:Company = new Company();
> > var c2:Company = new Company();
> > c1.name= "ABC";
> > c2.name = "XYZ";
> > companyList.addItem(c1);
> > companyList.addItem(c2);
> > }
> >
> > /*
> > * Works if name is declared as Bindable in the Company class
> > */
> > public function changeCompany():void{
> > var obj:Company = companyList.getItemAt(0) as Company;
> > obj.name = "ABC Modified";
> > }
> > ]]>
> > </mx:Script>
> > <mx:HBox>
> > <mx:VBox>
> > <mx:DataGrid dataProvider="{dp}"/>
> > <mx:Button click="changeDataProvider()" label="Change data"/>
> > </mx:VBox>
> > <mx:VBox>
> > <mx:DataGrid dataProvider="{companyList}">
> > <mx:columns>
> > <mx:DataGridColumn dataField="name" headerText="Company"/>
> > </mx:columns>
> > </mx:DataGrid>
> > <mx:Button click="changeCompany()" label="Change Company"/>
> > </mx:VBox>
> > </mx:HBox>
> > </mx:Application>
> >
> > *******Company.as****************
> > package
> > {
> > public class Company
> > {
> > public function Company()
> > {
> > super();
> > }
> > [Bindable]
> > public var name:String;
> >
> > }
> > }
> >
> > --- In [email protected] <flexcoders%40yahoogroups.com>,
"Josh
> > McDonald" <dznuts@> wrote:
> > >
> > > If you call addItem(), updateItem(), etc, the
PropertyChangedEvent is
> > > dispatched by the IList implementor (ie, ArrayCollection).
> > >
> > > But, if you have an IList of objects, and you do this:
> > >
> > > var company : Company = companyList.getItemAt(3) as Company;
> > > company.name = "New name";
> > >
> > > then you'll only get the new data on screen if Company (or
> > Company.name) is
> > > marked [Bindable]
> > >
> > > When you call the modifying methods on the dataprovider itself,
then the
> > > change is marked as happening on the IList (and it dispatches the
> > > PropertyChangedEvent). But if you change the content of an object
> > contained
> > > within that list, nobody knows about it unless you add the
[Bindable].
> > > [Bindable] is a compile-time decorator that dispatches the events on
> > your
> > > behalf.
> > >
> > > If I'm making things muddier rather than clearer with that, let me
> > know ;-)
> > >
> > > -J
> > >
> > > On Mon, May 19, 2008 at 2:01 PM, gaurav1146 <gaurav1146@> wrote:
> > >
> > > > Hi,
> > > > I have been using Bindable tag for data providers in datagrid,
list
> > > > etc. The doc states that this ensures that the destination
datagrid
> > > > would reflect the change when the dataprovider is changed. But
I have
> > > > observed that even if I do not use the Bindable tag the
datagrid is
> > > > still updated when the dataprovider changes. Here is a simple
example:
> > > >
> > > > <?xml version="1.0" encoding="utf-8"?>
> > > > <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml";
> > > > layout="absolute">
> > > > <mx:Script>
> > > > <![CDATA[
> > > > import mx.collections.ArrayCollection;
> > > > /*Bindable tag not added. Flex Builder gives a warning when
> > > > the variable is referenced in the datagrid but it still works.*/
> > > > private var dp:ArrayCollection = new ArrayCollection([{index:1,
> > > > word:"Test1"},{index:2, word:"Test2"}])
> > > > public function changeDataProvider():void
> > > > {
> > > > var obj1:Object = new Object();
> > > > obj1["index"] = 1;
> > > > obj1["word"] = "Modified Test1";
> > > > dp.setItemAt(obj1,0);
> > > > var obj2:Object = new Object();
> > > > obj2["index"] = 3;
> > > > obj2["word"] = "Test3";
> > > > dp.addItem(obj2);
> > > > }
> > > > ]]>
> > > > </mx:Script>
> > > > <mx:VBox>
> > > > <mx:DataGrid dataProvider="{dp}"/>
> > > > <mx:Button click="changeDataProvider()" label="Change data"/>
> > > > </mx:VBox>
> > > > </mx:Application>
> > > >
> > > > In the above example the datagrid changes on the button click.
Please
> > > > let me know if I am missing somthing.
> > > >
> > > >
> > > >
> > >
> > >
> > >
> > > --
> > > "Therefore, send not to know For whom the bell tolls. It tolls for
> > thee."
> > >
> > > :: Josh 'G-Funk' McDonald
> > > :: 0437 221 380 :: josh@
> > >
> >
> >  
> >
> 
> 
> 
> -- 
> "Therefore, send not to know For whom the bell tolls. It tolls for
thee."
> 
> :: Josh 'G-Funk' McDonald
> :: 0437 221 380 :: [EMAIL PROTECTED]
>


Reply via email to