Home Page

12 Marzo 2008

Flex 2: come implementare un binding bidirezionale tra un DataGrid e un Form

In questo articolo vedremo come sia possibile effettuare un collegamento (binding) tra i dati in una riga di un DataGrid con i campi di un Form in maniera bidirezionale, facendo sì che modificando i dati nel Form questi si aggiornino automaticamente anche nel DataGrid.

Quello che sembra un esercizio banale si rivela in realtà di non così immediata realizzazione, perché il binding in Flex è un meccanismo unidirezionale, come mostra l’esempio sottostante:


Il codice (semplificato) corrispondente all’esempio mostrato è il seguente:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application
    xmlns:mx="http://www.adobe.com/2006/mxml"
    layout="vertical"
    width="456" height="400">
  <mx:XMLList id="employees">
    <employee>
      <name>Christina Coenraets</name>
      <phone>555-219-2270</phone>
      <email>ccoenraets@fictitious.com</email>
    </employee>
    <employee>
      <name>Joanne Wall</name>
      <phone>555-219-2012</phone>
      <email>jwall@fictitious.com</email>
    </employee>
    <employee>
      <name>Maurice Smith</name>
      <phone>555-219-2012</phone>
      <email>maurice@fictitious.com</email>
    </employee>
  </mx:XMLList>
  <mx:Panel
      title="DataGrid e Form - binding unidirezionale">
    <mx:Label ext="Select a row in the DataGrid control."/>
    <mx:DataGrid id="dg" dataProvider="{employees}">
      <mx:columns>
        <mx:DataGridColumn
          dataField="name"
          headerText="Name"/>
        <mx:DataGridColumn
          dataField="phone"
          headerText="Phone"/>
        <mx:DataGridColumn
          dataField="email"
          headerText="Email"/>
      </mx:columns>
    </mx:DataGrid>
    <mx:Form>
      <mx:FormItem label="Name">
        <mx:TextInput text="{dg.selectedItem.name}"/>
      </mx:FormItem>
      <mx:FormItem label="Email">
        <mx:TextInput text="{dg.selectedItem.email}"/>
      </mx:FormItem>
      <mx:FormItem label="Phone">
        <mx:TextInput text="{dg.selectedItem.phone}"/>
      </mx:FormItem>
    </mx:Form>
  </mx:Panel>
</mx:Application>

L’effetto che invece si desidera ottenere è quello mostrato di seguito:


Per ottenere un simile risultato occorre definire un oggetto di supporto e seguire i seguenti passaggi:

  • definire un binding tra i campi del Form e i campi dell’oggetto di supporto
  • fare in modo che l’oggetto di supporto assuma i valori della riga selezionata nel DataGrid

Il codice (semplificato) corrispondente all’esempio mostrato è il seguente:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application
  xmlns:mx="http://www.adobe.com/2006/mxml"
  xmlns:wg="com.webgriffe.samples.*">
  <mx:ArrayCollection id="employees">
    <wg:Person>
      <wg:name>Christina Coenraets</wg:name>
      <wg:phone>555-219-2270</wg:phone>
      <wg:email>ccoenraets@fictitious.com</wg:email>
    </wg:Person>
    <wg:Person>
      <wg:name>Joanne Wall</wg:name>
      <wg:phone>555-219-2012</wg:phone>
      <wg:email>jwall@fictitious.com</wg:email>
    </wg:Person>
   <wg:Person>
     <wg:name>Maurice Smith</wg:name>
     <wg:phone>555-219-2012</wg:phone>
     <wg:email>maurice@fictitious.com</wg:email>
   </wg:Person>
  </mx:ArrayCollection>  <wg:Person id="per"
    name="{inName.text}"
    phone="{inPhone.text}"
    email="{inEmail.text}" />
    <mx:Panel title="DataGrid e Form - binding bidirezionale">
    <mx:Label text="Select a row in the DataGrid control."/>
    <mx:DataGrid id="dg" dataProvider="{employees}"
      itemClick="per=Person(event.currentTarget.selectedItem);">
      <mx:columns>
        <mx:DataGridColumn
            dataField="name"
            headerText="Name"/>
        <mx:DataGridColumn
            dataField="phone"
            headerText="Phone"/>
        <mx:DataGridColumn
            dataField="email"
            headerText="Email"/>
      </mx:columns>
    </mx:DataGrid>
    <mx:Form>
      <mx:FormItem label="Name">
        <mx:TextInput id="inName" text="{per.name}"/>
      </mx:FormItem>
      <mx:FormItem label="Phone">
        <mx:TextInput id="inPhone" text="{per.phone}"/>
      </mx:FormItem>
      <mx:FormItem label="Email">
        <mx:TextInput id="inEmail" text="{per.email}"/>
      </mx:FormItem>
    </mx:Form>
  </mx:Panel>
</mx:Application>

Il codice completo dell’esempio è scaricabile facendo clic qui.

Pubblicato in Flex

Scrivi un commento

TROVA:

Informazioni su questo blog Informazioni su questo blog Abbonati ai Feed RSS di questo Blog Abbonati ai Feed RSS di questo Blog Scarica lo screen saver di shines Scarica lo screen saver di shines Scarica il nostro software Scarica il nostro software
Story of Stuff