di: Andrea Boschin 28 Aprile 2010
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>
Guida Windows Azure Code SnippetsLe migliori pratiche per far girare le applicazioni "in the cloud",... |
Guida ASP.NET MVC Best PracticesUn workflow dettagliato e ricco di suggerimenti pratici per... |
Guida ASP.NET Starter KitUn modo semplice per imparare ad utilizzare le tecnologie Microsoft... |
Ogni giovedì, direttamente nella tua e-mail: articoli, guide, tutorial e script ASP, ASP.Net, SQL server e IIS.
Iscriviti alla newsletter
|
|
Corso Progettazione database11 Maggio 2012 a Milano |
|
|
Amministratore di Reti Windows Server 200811 Giugno 2012 a Milano |
|
Nessun corso previsto |