ViewModel과 DataContext를 묶는 좋은 방법은?

ViewModel과 DataContext를 묶는 좋은 방법은?

이철우

C# WPF 패턴 MVVM에서 ViewModel과 DataContext를 묶는 방법은 다양[참조 1]하다. 스택오버플로우에 이에 대한 질문과 답[참조 2]이 있어 소개한다.

질문)

MainWindow 또는 UserControl에서 ViewModel을 DadaContext에 묶을 때,

  1. XAML에서 하는 방법
    <UserControl.DataContext>
        <local:DataMainViewModel x:Name="vm"/>
    </UserControl.DataContext>
  1. 코드에서 하는 방법
    public DataMainView()
    {
        InitializeComponent();
        DataContext = new DataMainViewModel();
    }

이 있다면 어느 것이 좋은가?

아울러 질문자는 1)은 사용하지 말아야 한다는 얘기를 들었고, 2)는 인텔리센스가 안되기 때문에 불편하다고 했다.

답)

XAML이나 코드에서 UserControl의 DataContext를 명시적으로 설정해서는 안된다. UserControl은 그 부모 요소로부터 DataContext를 상속받기 때문이다. 그리고 이에 대한 자세한 설명이 있다. [참조 2]를 보기 바란다.

그렇다면, 의미상 상속 없는 MainWindow에 대해서는 어떤가? 인텔리센스 때문에 1)을 써야하는가? MainWindow 태그 안에

d:DataContext="{d:DesignInstance Type=UI:MainViewModel, IsDesignTimeCreatable=True}"

를 삽입한다면 이 문제는 해결된다.

그럼, 1)은 왜 사용하지 말아야 한다고 얘기를 들었을까? UserControl의 경우는 [참조 2]에 설명이 나온다. MainWindow의 경우는 개인 취향에 따라 1) 또는 2)를 선택할 수 있겠다.

참조 1. [c# wpf] DataContext 다양한 연결 방법(with binding)
https://yeko90.tistory.com/entry/wpf-DataContext-다양한-방법

참조 2. WPF DataContext in XAML, why and what’s the correct approach

4 Likes

최근에 인텔리센스가 안되어도 1)이 안된다는 것만 알고 Crtl + Shift + T 쓰고 있었는데 방법을 찾은거 같네요 ㅎㅎ 감사합니다 ~

4 Likes