우리 모두가 알고있는 M-V-VM의 요점은 걱정에 관한 것입니다. MVVM, MVC 또는 MVP와 같은 패턴에서 주된 목적은 데이터에서보기를 분리하여보다 유연한 구성 요소를 구축하는 것입니다. 먼저 많은 WPF 응용 프로그램에서 볼 수있는 매우 일반적인 시나리오를 시연하고 내 요점을 만들 것입니다 :M-V-VM은보기로 누출되는 모델이 아닙니까?
따옴표 묶음을 묶어서 화면에 표시하는 StockQuote 응용 프로그램이 있다고 가정 해보십시오. 일반적으로이있을 것 :
StockQuote.cs을 : (모델)
public class StockQuote
{
public string Symbol { get; set; }
public double Price { get; set; }
}
StockQuoteViewModel.cs : (뷰 모델)
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을 통해 뷰에 노출됩니다. 기본적으로, 뷰는 모델에 대한 지식을 가지고 있음을 의미합니다. 그것은 M-V-VM의 전체 패러다임을 위반하지 않습니까? 아니면 내가 여기서 뭔가를 놓치고 ....?
WPF 데이터 바인딩의 '느슨한'특성에 의존하기는하지만 좋은 지적입니다. 그러나 StockQuote 컬렉션을 사용하는 VM에 대한 단위 테스트를 작성한 경우 StockQuote 클래스를 변경하면 중단됩니다. –