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] >

