2017-11-26 8 views
-5

C#을 사용하여 MVVM WPF 응용 프로그램을 디자인하려고하는데 필요한 힌트가 필요하며 필요한 MVVM 모델을 설계하는 데 조언을 받아야합니다. 기술적으로 이것은 사용자가 MapView 컨테이너 내부에 다른 레이어를 오버레이 할 수있게 해주는 맵 기반 애플리케이션입니다. 이 레이어 중 일부는 목적을 나타내는 데 사용되지만 다른 일부는 편집 할 수있는 기능이 있습니다.WPF 및 MVVM 모델 디자인에 대한 힌트가 필요합니다.

내 질문에 모든 오버레이 클래스에 동일한 MVVM 패턴을 만들어야합니까? 이 경우에 나는

- Models 
     MapModel.ca 
     BaseMapModel.cs 
     GraphicsModel.cs 
     GDBModel.cs 
- ViewModels 
     MapViewModel.cs 
     BaseMapViewModel.cs 
     GraphicsViewModel.cs 
     GDBViewModel.cs 
- Views 
     MapView.cs 
     BaseMapView.cs 
     GraphicsView.cs 
     GDBView.cs 

지금 내가 MapViewModel.cs에 무엇을 가지고지도에 각 뷰를로드 할 수있는 방법; MainWindows.xaml.cs에서

class MapViewModel 
{ 
    private Map map; 
    public Map Map 
    { 
     get { return map; } 
     set { this.map = value; } 
    } 
    public MapViewModel() 
    { 
      this.map = new Map(); 
    } 
} 

내가

<Grid> 
    <esri:MapView x:Name="MyMapView" Map="{Binding Map}"/> 
</Grid> 

MainWindows.xaml

public MainWindow() 
    { 
     InitializeComponent(); 
     var viewModel = new MapViewModel(); 
     this.DataContext = viewModel; 
    } 

이 지금 무슨 일이 혼란 나를 내가 MapViewModel.cs 새로운보기를 추가 할 수있는 방법인가?

+0

'MainWindow' 생성자는'ViewModel' 인스턴스를 생성 할 책임이 없습니다. 'MvvmLight' 라이브러리를보고 의존성 삽입과'ViewModelLocator'를 사용할 것을 권한다. – Dai

+1

호기심에서 벗어난 이유는 무엇입니까? –

답변

2

주 창에 대한 ViewModel을 가져 오는 방법 중 하나입니다 (이 경우 MapViewModel을 사용할지 여부를 결정하고 다른 하위 ViewModels를 인스턴스화 할 수 있습니다). 그러면 Window에서 각각의 ViewModel에 대해 DataTemplate 리소스를 지정할 수 있습니다.이 리소스는 View를 참조하고 ContentPresenter을 사용하여 표시 할 ViewModel을 표시합니다. 예를 들어

: ViewModelBase, 혹은 같은 것을 단순히 여기 objectMainContentViewModel를 정의하지만, 일반적으로 내가 사용하는 것입니다

public class MainWindowViewModel : INotifyPropertyChanged // or MapViewModel 
{ 
    private object _mainContentViewModel; 
    public object MainContentViewModel 
    { 
     get { return _mainContentViewModel; } 
     set 
     { 
      if (_mainContentViewModel != value) 
      { 
       _mainContentViewModel = value; 
       NotifyPropertyChanged(); 
      } 
     } 
    } 

    public MainWindowViewModel() 
    { 
     // set MainContentViewModel as an initial example 
     MainContentViewModel = new GraphicsViewModel(); 
    } 
} 

참고 :

<Window x:Class="MyApp.Views.MainWindow" 
     ... 
     xmlns:vm="clr-namespace:MyApp.ViewModels" 
     xmlns:vw="clr-namespace:MyApp.Views"> 
    <Window.DataContext> 
     <vm:MainWindowViewModel /> 
    </Window.DataContext> 
    <Window.Resources> 
     <DataTemplate DataType="{x:Type vm:GraphicsViewModel}"> 
      <vw:GraphicsView /> 
     </DataTemplate> 
     <DataTemplate DataType="{x:Type vm:GDBViewModel}"> 
      <vw:GDBView /> 
     </DataTemplate> 
    </Window.Resources> 
    <Grid> 
     <ContentPresenter Content="{Binding MainContentViewModel}" /> 
    </Grid> 
</Window> 

그리고 뷰 모델에

어떤 종류의 추상 클래스.

가 지휘를 통해, 예를 들어,이 패턴을 사용하여 ViewModels를 탐색의 다음 여러 가지 방법이 있습니다, 또는 당신은

당신은 할 수도 등 (하나 이상의 ContentPresenter을함으로써) 한 번에 여러 ViewModels를 표시 할 수 있습니다 MainWindowViewModel에있는 "sub-ViewModel"의 인스턴스를 가져야합니다. 즉, ViewModel을 표시하지 않고 유지하려는 경우입니다.