ASP.Net  »  Articoli  »  Silverlight 

MVVM: Applicare il pattern in progetti Silverlight

di: Andrea Boschin     28 Aprile 2010

Il ViewModel

Il ViewModel è la classe che fa da connettore tra View e Model. Nel caso dell'esempio dovrà esporre delle proprietà contenenti i dati da visualizzare nell'interfaccia. Essa inoltre si farà carico di chiamare il Model per ottenere da esso i prodotti che rispettano la query. Il Model verrà passato al ViewModel come argomento, usando l'interfaccia da esso implementata. Questo ci consentirà poi di usare la Dependency Injection per rendere testabile il ViewModel.

public class ProductViewModel
{
  private IProductRepository Repository { get; set; }
  public ObservableCollection<Product> Products { get; set; }
  
  public ProductViewModel(IProductRepository repository)
  {
    this.Repository = repository;
    this.Products = new ObservableCollection<Product>();
    
    // carico i prodotti dal repository
    this.Load(string.Empty);
  }
  
  private void Load(string keyword)
  {
    this.Repository.GetProductsByKeyword(
                       keyword,
                       BindProducts,
                       Utilities.PublishException);
  }
  
  private void BindProducts(IEnumerable<Product> result)
  {
    this.Products.Clear();
    
    foreach (Product prd in result) this.Products.Add(prd);
  }
}

La classe è piuttosto semplice e comprensibile. Nel costruttore si inizializza la proprietà Products, dichiarata come ObservableCollection<Product> e poi si chiama il metodo che caricherà i prodotti dal database. All'arrivo dei prodotti, quando il caricamento è completo, essi sono aggiunti alla collection.

La parte importante da tenere presente è l'uso di ObservableCollection. Tale classe infatti implementando INotifyCollectionChanged è in grado di notificare quando viene modificato il suo contenuto. In questo modo il ViewModel può essere iniettato nel DataContext delle View e la sua proprietà "Bindata" ad uno specifico controllo. Vediamo il markup XAML:

<UserControl x:Class="MyApplication.MainPage"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             mc:Ignorable="d" d:DesignWidth="640" d:DesignHeight="480">

  <Grid x:Name="LayoutRoot">
    <ItemsControl ItemsSource="{Binding Products}">
      <ItemsControl.ItemTemplate>
        <DataTemplate>
          <TextBlock Text="{Binding Name}" />
        </DataTemplate>
      </ItemsControl.ItemTemplate>
    </ItemsControl>
  </Grid>
</UserControl>

Guide ASP.Net

Guida Windows Azure Code Snippets

Le migliori pratiche per far girare le applicazioni "in the cloud",...

Guida ASP.NET MVC Best Practices

Un workflow dettagliato e ricco di suggerimenti pratici per...

Guida ASP.NET Starter Kit

Un modo semplice per imparare ad utilizzare le tecnologie Microsoft...

Altre guide

Newsletter @Microsoft Dev

Ogni giovedì, direttamente nella tua e-mail: articoli, guide, tutorial e script ASP, ASP.Net, SQL server e IIS.

Iscriviti alla newsletter

Altre newsletter

Corsi in aula

Corso Progettazione database

11 Maggio 2012 a Milano
Disponibilità: 6 Posti

Amministratore di Reti Windows Server 2008

11 Giugno 2012 a Milano
Disponibilità: 5 Posti

Nessun corso previsto