이번 포스팅에서는 DataContext를 연결함에 있어 다양한 방법에 대해 알아보고자 합니다.
이 글을 읽기 전 선수 지식 포스팅
- [c# wpf] DataContext란? 왜 쓰는 것일까?
- [c# wpf] 데이터 바인딩 기초 개념/ 예제
- [c# wpf] StaticResource란? (DynamicResource 비교)
1. 왜 굳이 다양한 방법으로 알아볼까요?
이는 제가 구글링하면서 느낀점이기도 한데요.
같은 내용의 코드인데도 불구하고 다른 방식으로 작성된 코드를 전혀 다른 기능으로 착각하는 경우가 왕왕 있기 때문입니다.
무엇보다 하나의 내용을 다양한 관점으로 이해하고 사용가능한것이 정확하게 아는거라 생각합니다. :)
2. 목표
Person 클래스의 프러퍼티로 설정된 값들을
Window 창에 아래와같이 출력해보려고 합니다. 이를 위한 중간 다리로 DataContext를 사용해보겠습니다.
3. 예제 코드
1) 코드 비하인드단에 DataContext 명시
(1) Window 태그 전체 기준
여기서 DataContext는 this.DataContext의 축약형이며 Window Tag 전체를 커버한다는 의미입니다.
다시말하면 Window 태그안 전체 범위에서 해당 클래스에 바인딩을 통해 접근 가능하다는 것입니다.
//MainWindow.xaml
간단한 UI를 구성해보았고 각각 Binding을 통해 Person 클래스의 프러퍼티에 접근 가능하게 되었습니다.
(2) 특정 태그 기준(범위축소)
이번엔 Window태그 전체가 아니라 특정 태그안에서만 사용가능하도록 하고싶습니다.
태그의 x:Name을 통해 이름을 부여합니다.
//MainWindow.xaml.cs
지정한 이름을 참조한 이름.DataContext에 Person객체를 할당합니다.
2) xaml에 DataContext 명시
//MainWindow.xaml.cs
기존에 코드비하인드단에 작성하였던 DataContext를 지웁니다.
(1) <~.DataContext> 태그 형태
코드비하인드단에 this.DataContext = new Person()을 위와 같이 작성할 수도 있습니다.
<Window.DataContext>태그를 만듭니다.
여기서 Window는 Window태그 전체를 범위로 한다는 의미입니다.
<local:Person/>은 local은 아래 네임스페이스를 가리키고
그 네임스페이스 안에서 Person 클래스를 가져오겠다는 의미입니다.
정리하자면 <Window.DataContext>안에 해당 클래스를 넣은 형태로 코드비하인드단에서 할당한것과 같은 역할을 하는 것입니다.
그럼 범위를 축소하는 방법도 있겠죠?
<StackPanel> 안에서만 동작하는 코드입니다.
주의할점은 해당 태그 안에넣어주는 형태로 적어주어야 한다는 것입니다.
(2) <~.Resources> 태그 형태
이번에는 <Window.Resources>를 이용한 방법입니다.
<Window.DataContext>랑 비슷해보이지만 이번 같은 경우에는 x:Key값을 통해 해당 클래스의 이름을 지어줘야합니다.
그리고 x:Key값을 DataContext속성값에 넣어주는 형태인데요.
이때는 {StaticResource x:Key명} 형태로 넣어주게 됩니다.
(해당 부분이 낯선분은 StaticResource 포스팅을 읽고 와주시기 바랍니다.)
지금까지는 xaml이든 코드비하인드던 DataContext라는 키워드가 사용되었는데요.
DataContext 키워드 사용없이도 같은 기능을 구현할 수 있습니다.
바로 DataTemplate을 이용하는 방법입니다.
이는 DataTemplate포스팅에서 다루도록 하겠습니다.
'c# > wpf' 카테고리의 다른 글
[c# wpf] DataTemplate 사용 방법 (1) | 2022.06.27 |
---|---|
[c#] 델리게이트를 왜 쓸까? (1) | 2022.06.24 |
[c# wpf] 콤보박스 selecteditem vs selectedvalue 차이점 (0) | 2022.06.24 |
[c# wpf] ObservableCollection란? (1) | 2022.06.24 |
[c# wpf] 리스트뷰 출력 값에 % 붙히기(간단한 방법) (1) | 2022.06.23 |
댓글