본문 바로가기
Programming 개발은 구글로/C#[WPF]

C#[WPF] 디자인 패턴 중 MVVM 패턴을 알아보자

by 40대직장인 2022. 6. 1.

MVVM 디자인 패턴

: MVVM(Model View ViewModel)

  MVVM 패턴은 Command 패턴과 Data Binding 2가지 패턴을 사용한다.(여기선 Data Binding 패턴으로 사용)

 

 

■ Model

DataModel은 비즈니스 클래스로 구성된다. UI에 제공된 데이터를 갖고 있다.

DataModel은 쉽게 단위 테스트가 가능하다.

■ View

View는 UI이다. 이상적으로 View는 순수 Xaml로 구성된다.

View는 자동화된 테스트를 사용해 테스트가 어렵기 때문에 View의 코드 양을 줄여야 하는 이유이다.

View의 Datacontext는 ViewModel이다. 

■ ViewModel

ViewModel은 아래의 같은 기능을 담당한다.

  • 하나의 뷰에 대한 메서드로 속성 및 액션을 사용해 데이터를 노출한다.
  • 뷰를 참조하지 않아야 하지만 뷰에 크게 의존한다.
  • 다른 DataModel 혼합을 허용하거나 비동기 호출의 복잡성을 숨길 수 있다.
  • 단위 테스트를 쉽게 할 수 있다.
  • INotifyPropertyChanged를 구현한다.

■ MVVM 화면 코딩 순서

private double sound;

public double Sound { // 속성 추가
    get { return sound; }
    set { 
    	sound = value;
        onPropertyChanged("sound"); // 알림 속성
        onSoundChanged(); // 기능적 논리
    }
}

1. ViewModel를 생성한다.

 : Window, Page or UserControl 화면당 하나씩 생성되어한다.

 

예를 들면, 

  •  View: \View\Screen.xaml
  •  ViewModel: \View\ScreenViewModel.cs

2. ViewModel이 노출해야 하는 속성을 찾는다.

: 생성을 원하는 뷰를 확인해서 모든 사용자 입력이나 출력에 대한 ViewModel에 속성을 추가해야 한다.

 

3. 알림 속성(Notifying Properties)을 코딩한다.

: ViewModel에 추가되는 속성은 알림 속성이어야 한다.

 

4. ViewModel을 View의 DataContext로 사용한다.

: Xaml 사용 및 Code 비하인드 사용이다.

 

 - 아래 코드처럼 Xaml 사용 시 디자인 뷰를 표시할 경우 viewModel 클래스가 인스턴스화 될 수 있다.

<Window xmlns:vm="clr-namespace:ViewModels"
...
>

    <Window.DataContext>
        <vm:ScreenViewModel />
    </Window.DataContext>
...
</Window>

 - 코드 비하인드를 사용해서 DataContext 할당

public partial class Screen: Window
{
    public Screen()
    {
        InitializeComponent();
        this.DataContext = new ScreenViewModel();
    }
}

하지만, 디자인 뷰에서 데이터 바인딩 편집기의 도움을 받지 못한다.

 

해결책은 클래스를 지정하는 Xaml의 d:DataContext 특성을 사용하면 된다.

<Window xmlns:vm="clr-namespace:ViewModels"
    mc:Ignorable="d"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    d:DataContext="{d:DesignInstance vm:ScreenViewModel}"
...
>
...
</Window>

※ 비하인드를 사용해 DataContext를 할당하는 건 동일하다.

 

5. View를 ViewModel에 데이터 바인딩한다.

: 데이터 바인딩을 한다.

...
<TextBlock Text="{Binding Sound}" .../>
...

 

6. 기능적 논리를 코딩한다.(3단계부터 수행 가능)

: ViewModel로 가서 sound 속성의 설정자에서 onSoundChanged() 메서드 호출을 추가한다.

private void OnSoundChanged()
{
	Sounds = sound + 1;
}

 

■ MVVM 패턴의 장점과 단점

: MVVM 패턴의 장점은 view와 Model 사이의 의존성이 없습니다. 각각의 부분은 독립적이기 때문에 모듈화 하여 개발할 수 있습니다. 단점으로는 View Model의 설계가 쉽지 않습니다.

 

참고: WPF MVVM 일주일 만에 배우기

'Programming 개발은 구글로 > C#[WPF]' 카테고리의 다른 글

C# Data Type  (0) 2022.06.02
C#[WPF] HID 연동 예제 코드  (0) 2022.04.25
C#[WPF] Window 알림 콘텐츠  (0) 2022.04.25
C#[WPF] 내문서 폴더 경로 가져오기  (0) 2022.04.24
C#[WPF] Get Window 스피커 정보  (0) 2022.04.23

댓글