본문 바로가기

개인공부/WPF

[WPF] DataContext

■ DataContext란?

데이터 바인딩을 위한 소스 객체를 명시하는 속성

DataContext로 지정된 객체의 속성을 소스 객체로 사용할 수 있다.

 

DataContext 사용 방법

 - 필요한 형태의 Model Class 만들어서 사용

using System.Windows;

namespace DataContextEx
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            User user = new User();            
            this.DataContext = user;
        }
    }
}

· MainWindow의 DataContext 속성에 User Class로 생성한 객체 할당

· User Class의 속성을 바인딩하여 사용 가능

 

 - MainWindows 직접 사용

using System.Windows;

namespace DataContextEx
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();            
            this.DataContext = this;
        }
    }
}

· MainWindow의 DataContext 속성에 this 할당

· MainWindow의 자식 컨트롤을 바인딩하여 사용 가능

 

■ Datacontext Example 

 - Example 설명

   · DataContext에 User Class 객체 할당

   · MainWindows의 TextBox에 Binding

   · TextBox text속성 수정

   · 버튼 클릭, Binding된 user 객체의 name, age 정보를 MessageBox로 출력

 

 - MainWindow.xaml

MainWindow.xaml 디자인

 

<Window x:Class="DataContextEx.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:DataContextEx"
        mc:Ignorable="d"
        Title="MainWindow" Height="120" Width="350">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <Label Content="Name : " Grid.Row="0" Grid.Column="0"/>
        <TextBox Text="{Binding name}" Width="200" Height="20" Grid.Row="0" Grid.Column="1" />

        <Label Content="Age : " Grid.Row="1" Grid.Column="0"/>
        <TextBox Text="{Binding age}" Width="200" Height="20" Grid.Row="1" Grid.Column="1" />

        <Button x:Name="msg_btn" Content="Show Box" Width="100" Height="20" 
        	Grid.Row="2" Grid.Column="1" Click="msg_btn_Click"/>
    </Grid>
</Window>

 

 - MainWindow.xaml.cs

using System.Windows;

namespace DataContextEx
{
    public partial class MainWindow : Window
    {
        User user;
        public MainWindow()
        {
            InitializeComponent();
            User user = new User()
            {
                name = "홍길동",
                age = 20
            };
            
            this.DataContext = user;
        }

        private void msg_btn_Click(object sender, RoutedEventArgs e)
        {
            User user = this.DataContext as User;
            MessageBox.Show($"name : {user.name}, age : {user.age}");
        }
    }
}

 

 - User.cs

namespace DataContextEx
{
    class User
    {
        public string name { get; set; }
        public int age { get; set; }
    }
}

 - user 객체 초기화 내용, textbox에 출력

 - textbox 수정 전 message box 출력 확인

 - textbox 내용 수정

 - message box 출력 확인