众所周知,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/

10-11 00:51