lunedì 28 novembre 2011

Silverlight - Simulazione navigazione dati (stile Access)

Silverlight 4.0

Nella mia applicazione avevo la necessità di navigare tra i dati di una child window, stile Access tanto per intenderci.

Questa la view in questione, che ha il compito di gestire i Cespiti in carico.



Al loaded della view viene eseguito il binding dell’oggetto Cespite recuperato tramite un servizio WCF RIA Service. Nel mio caso il DocumentContext è il contesto al servizio che gestisce tutto il documento: ritenute d’acconto, ratei/risconti e cespiti compresi.
readonly DocumentoContext _documentoContext;

Cespite cespite = _documento.Cespite.Count > 0 ? _documento.Cespite.FirstOrDefault()
                                                : new Cespite();

if (_documento.Cespite.Count == 0)
   _documento.Cespite.Add(cespite);

LayoutRoot.DataContext = cespite;

A seconda se ne esistono già viene caricato il primo della lista o ne viene creato uno nuovo (in questo modo poi possiamo fare a meno del pulsante Nuovo nella toolbar).
Per passare quindi al cespite successivo o crearne uno di nuovo basta premere il pulsante con la freccia verso destra, al quale è associato il seguente evento:

private void NextCespiteClicked(object sender, MouseButtonEventArgs e)
{
      _index += 1;

      if (_index > _documentoContext.Cespites.Count - 1)
      {
          // Non ci sono cespiti, ne viene aggiunto quindi uno al contesto.
          Cespite cespite = new Cespite();
          _documento.Cespite.Add(cespite);

         // Binding del cespite appena creato alla view
         LayoutRoot.DataContext = cespite;
     }
     Else
         // Viene eseguito il binding del cespite dell'indice corrispondente.
         LayoutRoot.DataContext = _documentoContext.Cespites.ElementAt(_index);
}

Invece per andare all’elemento precedente basta premere il pulsante con la freccia verso sinistra al quale è associate il seguente evento:

private void PreviousCespiteClicked(object sender, MouseButtonEventArgs e)
{        
     if(_index >= 1)
     {
          _index -= 1;
          LayoutRoot.DataContext = _documentoContext.Cespites.ElementAt(_index);
     }
}

Chiaramente è un meccanismo alquanto semplice, abbastanza efficace, che può essere esteso a proprio piacimento.