Il punto di M-V-VM, come tutti sappiamo, riguarda la sperarazione delle preoccupazioni. In modelli come MVVM, MVC o MVP, lo scopo principale è disaccoppiare la vista dai dati, creando in tal modo componenti più flessibili. Dimostrerò per prima cosa uno scenario molto comune trovato in molte app WPF e quindi farò il mio punto:M-V-VM, il modello non sta filtrando nella vista?
Supponiamo di avere qualche applicazione StockQuote che trasmette un sacco di citazioni e le visualizza sullo schermo. In genere, devi avere questo:
StockQuote.cs: (Modello)
public class StockQuote
{
public string Symbol { get; set; }
public double Price { get; set; }
}
StockQuoteViewModel.cs: (ViewModel)
public class StockQuoteViewModel
{
private ObservableCollection<StockQuote> _quotes = new ObservableCollection<StockQuote>();
public ObservableCollection<StockQuote> Quotes
{
get
{
return _quotes;
}
}
}
StockQuoteView.xaml (View)
<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication1"
Title="Window1" Height="300" Width="300">
<Window.DataContext>
<local:StockQuoteViewModel/>
</Window.DataContext>
<Window.Resources>
<DataTemplate x:Key="listBoxDateTemplate">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Symbol}"/>
<TextBlock Text="{Binding Price}"/>
</StackPanel>
</DataTemplate>
</Window.Resources>
<Grid>
<ListBox ItemTemplate="{StaticResource listBoxDateTemplate}" ItemsSource="{Binding Quotes}"/>
</Grid>
</Window>
E poi avresti qualche tipo di servizio che alimenterebbe ObservableCollection con nuovi Stockquotes.
La mia domanda è questa: in questo tipo di scenario, lo stockquota è considerato il modello e lo stiamo esponendo alla vista attraverso ObservableCollection di ViewModel. Che in pratica significa, la nostra vista ha conoscenza del modello. Questo non viola l'intero paradigma di M-V-VM? O mi manchi qualcosa qui ....?
Questo è un buon punto, anche se si basa sulla natura "libera" di WPF Data Binding. Se avessi scritto un test unitario per la VM che faceva affidamento sulla collezione StockQuote, tuttavia, si interromperà se hai cambiato la classe StockQuote. –