ViewModel과 DataContext를 묶는 좋은 방법은?
이철우
C# WPF 패턴 MVVM에서 ViewModel과 DataContext를 묶는 방법은 다양[참조 1]하다. 스택오버플로우에 이에 대한 질문과 답[참조 2]이 있어 소개한다.
질문)
MainWindow 또는 UserControl에서 ViewModel을 DadaContext에 묶을 때,
- XAML에서 하는 방법
<UserControl.DataContext>
<local:DataMainViewModel x:Name="vm"/>
</UserControl.DataContext>
- 코드에서 하는 방법
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