Le point de M-V-VM comme nous le savons tous est au sujet de la speraration des soucis. Dans les modèles tels que MVVM, MVC ou MVP, l'objectif principal est de découpler la vue des données afin de créer des composants plus flexibles. Je vais d'abord montrer un scénario très courant dans de nombreuses applications WPF, puis je ferai valoir mon point de vue:M-V-VM, le modèle ne fuit-il pas dans la vue?
Disons que nous avons une application StockQuote qui diffuse un ensemble de citations et les affiche à l'écran. En règle générale, vous auriez ceci:
StockQuote.cs: (Modèle)
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 (Voir)
<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>
Et puis vous auriez un genre de service qui alimenterait ObservableCollection avec de nouvelles StockQuotes.
Ma question est la suivante: Dans ce type de scénario, StockQuote est considéré comme le modèle, et nous l'exposons à la vue à travers ObservableCollection du ViewModel. Ce qui signifie fondamentalement, notre vue a la connaissance du modèle. Cela ne viole-t-il pas tout le paradigme de M-V-VM? Ou est-ce que je manque quelque chose ici ...?
C'est un bon point, bien qu'il repose sur la nature «lâche» de la liaison de données WPF. Cependant, si vous aviez écrit un test unitaire pour la machine virtuelle qui dépendait de la collection StockQuote, elle se briserait si vous changiez la classe StockQuote. –