Programming/C#

[WPF] 의존 프로퍼티!?

Teemol 2019. 3. 8. 23:21

안녕하세요. 간단하게 따라 할 수 있는 예제를 만드는 Teemol입니다!


오늘의 예제는 WPF Dependency Property의 간단한 사용법만 알려드리려고 합니다.


여기서 Dependency Property(의존 프로퍼티)란,

의존 속성 값이 변경되면 자동으로 어떤 것을 처리하게 할 수 있게 해주는 것인데,

애니메이션, 스타일, 데이터 바인딩 등에서 사용된다고 합니다.


WPF에서 화면을 구성하는 다양한 컨트롤들도 의존 프로퍼티를 사용합니다.

예를 들어 MainWindow를 보면 Background, Width, Height 등 여러 가지 속성들도 의존 프로퍼티를 사용하고 있습니다.


이제 사용 방법을 알아보겠습니다!


먼저 아래와 같이 사용할 값을 등록합니다.


1
2
public static readonly DependencyProperty MeProperty = DependencyProperty.Register("Me"typeof(string), typeof(MainWindow),
                                                        new PropertyMetadata(""new PropertyChangedCallback(MeChanged)), ValidateMe);
cs


1번째 인자 Me => 이름을 등록합니다.

2번째 인자 typeof(string) => 사용할 타입을 입력합니다.

3번째 인자 typeof(MainWindow) => MeProperty를 소유한 클래스를 입력합니다.

4번째 인자 new PropertyMetadata("", new PropertyChangedCallback(MeChanged)) => ""는 초기값, MeChanged는 값이 변경되는 호출될 함수를 입력합니다.

5번째 인자 ValidateMe => 값이 변경될 때 값을 검사할 함수를 입력합니다.


4번째, 5번째는 선택입니다.


이제 DependencyProperty에서 설정한 Me의 값을 설정하고 얻어올 수 있는 Get, Set을 만들어 줍니다.


1
2
3
4
5
public string Me
{
    get { return (string)GetValue(MeProperty); }
    set { SetValue(MeProperty, value); }
}
cs


다음으로 값이 변경되면 실행될 함수를 만들어 줍시다.


1
2
3
4
5
6
7
static void MeChanged(DependencyObject property, DependencyPropertyChangedEventArgs args)
{
    MainWindow main = property as MainWindow;
 
    string value1 = args.OldValue as string;
    string value2 = args.NewValue as string;
}
cs


위 함수에서 property 값은 DependencyProperty를 소유한 클래스의 값을 받고,

args는 OldValues(입력되어있던 값), NewValue(새로 입력된 값) 등의 값을 얻어 올 수 있습니다.


이 함수에서 사용자가 원하는 이벤트를 넣어 사용하면 됩니다.


마지막으로 값을 검사할 함수를 만들어 줍니다.


1
2
3
4
5
static bool ValidateMe(object obj)
{
    string str = obj as string;
    return str!=null;
}
cs


위 함수에서는 입력받은 값을 검사합니다.


반환 값이 false면 ArgumentException을 발생시킵니다.


위와 같이 만들게 되면 아래처럼 값을 바꾸려 할 때


1
Me = "AA";
cs


ValidateMe에서 값을 검사하고, true가 반환되면 MeChanged가 호출됩니다.


여기서 true를 반환해도 OldValue와 NewValue가 같을 경우 MeChanged는 호출되지 않습니다.


여기까지, 간단하게 Dependency Property를 사용하는 방법을 알아봤습니다.


감사합니다.