众所周知,M-V-VM的关键在于关注点的分散。在MVVM,MVC或MVP之类的模式中,主要目的是将 View 与数据分离,从而构建更灵活的组件。我将首先演示在许多WPF应用程序中发现的一个非常常见的场景,然后我将提出自己的观点:
假设我们有一些StockQuote应用程序,该应用程序可以生成一堆报价并将其显示在屏幕上。通常,您将拥有以下功能:
StockQuote.cs :(模型)
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(查看)
<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>
然后,您将拥有某种服务,可以为ObservableCollection提供新的StockQuotes。
我的问题是:在这种情况下,StockQuote被视为模型,我们通过ViewModel的ObservableCollection将其暴露给View。基本上,这意味着我们的 View 具有模型知识。这不违反M-V-VM的整个范式吗?还是我在这里想念什么...?
最佳答案
不。您没有公开StockQuote。您仅在 View 中指定(宽松类型的)接口(interface)。该 View 仅知道两个属性:符号和价格。您可以轻松地用其他任何东西替换StockQuote,只要它实现了那些东西即可。
关于c# - M-V-VM,是不是模型泄漏到 View 中?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2641434/