Bei M-V-VM geht es, wie wir alle wissen, um die Trennung von Belangen. Bei 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 demonstrieren, das in vielen WPF-Anwendungen zu finden ist, und dann werde ich meinen Standpunkt darlegen:
Nehmen wir an, wir haben eine StockQuote-Anwendung, die eine Reihe von Kursen streamt und sie auf dem Bildschirm anzeigt. Normalerweise würde man das so machen:
StockQuote.cs : (Modell)
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 (Ansicht)
<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 eine Art Dienst, der die ObservableCollection mit neuen StockQuotes füttern würde.
Meine Frage ist folgende: In dieser Art von Szenario ist die StockQuote als das Modell, und wir sind, dass die Ansicht durch die ViewModel's ObservableCollection aussetzen. Das bedeutet im Grunde, dass unsere View Kenntnis vom Model hat. Verstößt das nicht gegen das gesamte Paradigma von M-V-VM? Oder übersehe ich hier etwas....?