[WPF] WPF 의존 프로퍼티(Dependency Property) 사용 방법

안녕하세요.

 

오늘은 WPF에서 의존 프로퍼티에 대해서 알아보려고 합니다.

 

영어로는 Dependency Property 라고 하는데요.

 

간단히 먼저 의존 프로퍼티에 대한 정의를 말씀드리면, 특정 의존 속성 값이 변경되면 자동으로 어떤 액션? 행동을 처리할 수 있게 해주는 것을 뜻합니다.

 

이렇게 말씀드리면 당연히 이해가 어려울 거라 생각이 들기 때문에, 예제를 통해서 한번 알아보도록 하겠습니다.

 

제가 예제를 통해 만들 프로그램은 ComboBox 컨트롤에 여러 개의 아이템들이 있고, 해당 Item을 클릭했을 때 그 Item에 대한 내용이 TextBox에 표시 되도록 하는 예제를 의존 프로퍼티를 이용해서 구현해 보도록 하겠습니다.

 

먼저 아래와 같이 Xaml을 작성하여서 ComboBox 컨트롤과 Textbox 컨트롤을 배치해 주시기 바랍니다.

 

 

MainWindows.xaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<Window x:Class="WpfApp1.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:WpfApp1"
        mc:Ignorable="d"
        Title="MainWindow" Height="300" Width="400">
 
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
 
        <ComboBox Width="150" Height="40" Grid.Column="0" Margin="10"
                  SelectionChanged="ComboBox_SelectionChenged">
            <ComboBoxItem>사과</ComboBoxItem>
            <ComboBoxItem>수박</ComboBoxItem>
            <ComboBoxItem></ComboBoxItem>
            <ComboBoxItem>오렌지</ComboBoxItem>
            <ComboBoxItem>딸기</ComboBoxItem>
        </ComboBox>
 
        <TextBox Name="uiTb_Fruit" Width="150" Height="40" Grid.Column="1" Text="과일 이름"/>
    </Grid>
 
</Window>
 
cs

 

비하인드 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
 
namespace WpfApp1
{
    /// <summary>
    /// MainWindow.xaml에 대한 상호 작용 논리
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
 
        /// <summary>
        /// Dependency Property 위한 래퍼 속성 MyFruit 생성
        /// </summary>
        public string MyFruit
        {
            get
            {
                return (string)GetValue(MyProperty);
            }
            set
            {
                SetValue(MyProperty, value);
            }
        }
 
        /// <summary>
        /// 의존프로퍼티 값 등록
        /// </summary>
        public static readonly DependencyProperty MyProperty = DependencyProperty.Register(
            "MyFruit",
            typeof(string),
            typeof(MainWindow),
            new FrameworkPropertyMetadata(new PropertyChangedCallback(OnMyPropertyChanged))
            );
 
        /// <summary>
        /// 특정 값이 변경되면 실행되는 이벤트 핸들러
        /// </summary>
        /// <param name="d"></param>
        /// <param name="e"></param>
        public static void OnMyPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            MainWindow win = d as MainWindow;
 
            win.Title = (e.OldValue == null) ? "선택된 과일 없음" : $"이전 선택된 과일은 {e.OldValue.ToString()} 입니다.";
            win.uiTb_Fruit.Text = e.NewValue.ToString();
        }
 
 
        /// <summary>
        /// ComboBox SelectionChanged 이벤트 핸들러
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void ComboBox_SelectionChenged(object sender, SelectionChangedEventArgs e)
        {
            ComboBox cb = sender as ComboBox;
            ComboBoxItem item = cb.SelectedItem as ComboBoxItem;
            MyFruit = item.Content.ToString();
        }
    }
}
 
cs

 

실행 결과

위와 같이 ComboBox에 과일을 선택하면, 해당 과일의 이름이 그대로 TextBox에 표시되는 것을 확인하실 수 있습니다.

 

, ComboBox의 속성 변경으로 인해 의존하고 있는 속성인 TextBoxText 속성이 함께 변경이 되는 것을 확인하였고, 이 개념이 의존 프로퍼티입니다~!

 

글 읽어 주셔서 감사합니다.^^

728x90

이 글을 공유하기

댓글

Designed by JB FACTORY