Der Punkt von M-V-VM, wie wir alle wissen, betrifft die Erstellung von Anliegen. In Mustern wie MVVM, MVC oder MVP besteht der Hauptzweck darin, die Ansicht von den Daten zu entkoppeln und dadurch flexiblere Komponenten zu erstellen. Ich werde zuerst ein sehr häufiges Szenario in vielen WPF-Anwendungen demonstrieren, und dann werde ich meinen Punkt machen:M-V-VM, leckt das Modell nicht in die Ansicht?
Sagen wir haben einige StockQuote-Anwendung, die eine Reihe von Angeboten streamt und zeigt sie auf dem Bildschirm. Normalerweise würde man dieses:
StockQuote.cs: (Modell)
public class StockQuote
{
public string Symbol { get; set; }
public double Price { get; set; }
}
StockQuoteViewModel.cs: (Ansichtsmodell)
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>
Und dann hätten Sie irgendeine Art von Service, der die ObservableCollection mit neuen StockQuotes füttern würde.
Meine Frage ist: In dieser Art von Szenario wird das StockQuote als das Modell betrachtet, und wir stellen das dem View durch die ObservableCollection des ViewModels zur Verfügung. Was im Grunde bedeutet, dass unser View das Modell kennt. Verstößt das nicht gegen das ganze Paradigma von M-V-VM? Oder vermisse ich hier etwas ....?
Das ist ein guter Punkt, obwohl es auf der "lockeren" Natur von WPF Data Binding beruht. Wenn Sie einen Komponententest für die VM geschrieben haben, der sich auf die StockQuote-Sammlung stützte, würde sie jedoch beschädigt, wenn Sie die StockQuote-Klasse ändern. –