El objetivo de M-V-VM como todos sabemos es acerca de la preocupación por las preocupaciones. En patrones como MVVM, MVC o MVP, el objetivo principal es desacoplar la vista de los datos y, por lo tanto, construir componentes más flexibles. Primero demostraré un escenario muy común que se encuentra en muchas aplicaciones de WPF, y luego expondré mi punto:M-V-VM, ¿no se está filtrando el modelo en la vista?
Digamos que tenemos alguna aplicación StockQuote que transmite un montón de citas y las muestra en la pantalla. Por lo general, tendría la siguiente:
StockQuote.cs: (Modelo)
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 (Ver)
<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>
Y luego tendría algún tipo de servicio que alimentaría a ObservableCollection con nuevas StockQuotes.
Mi pregunta es esta: en este tipo de escenario, el StockQuote se considera el Modelo, y lo estamos exponiendo a la Vista a través del ObservableCollection de ViewModel. Lo que básicamente significa que nuestra Vista tiene conocimiento del Modelo. ¿Eso no viola el paradigma completo de M-V-VM? ¿O me estoy perdiendo algo aquí ...?
Ese es un buen punto, aunque depende de la naturaleza "suelta" de WPF Data Binding. Sin embargo, si hubiera escrito una prueba unitaria para la VM que dependía de la colección StockQuote, se rompería si cambiara la clase StockQuote. –