본문 바로가기

프로그래밍&IT/C#.WPF

의존 프로퍼티 (Dependency Property)

WPF해야할 이유가 생겨서 책을 다시 보고 있다.

 

WPF에서 의존 프로퍼티 (Dependency Propery)란?

WPF에서 의존 프로퍼티(Dependency Property)는 WPF의 핵심적인 기능 중 하나로, WPF의 UI 요소들이

  • 데이터 바인딩
  • 스타일
  • 애니메이션

등에 의해 동적으로 변할 수 있는 속성을 지원하기 위해 설계되었습니다.

일반적인 .NET 속성과는 달리, 의존 프로퍼티는 WPF에서 성능 최적화와 기능 확장을 위해 만들어졌습니다.

 

의존 프로퍼티의 주요 기능

  1. 데이터 바인딩 지원: 의존 프로퍼티는 데이터 바인딩을 쉽게 지원하며, UI 요소와 데이터 소스 간의 동기화를 자동으로 처리합니다.
  2. 스타일과 트리거: WPF 스타일을 통해 의존 프로퍼티의 값을 설정할 수 있습니다.
  3. 애니메이션: 의존 프로퍼티는 애니메이션을 적용하여 값이 시간에 따라 변경되도록 할 수 있습니다.
  4. 기본값 제공 및 값 유효성 검사: 의존 프로퍼티는 기본값을 정의할 수 있고, 값을 설정할 때 유효성 검사를 할 수 있습니다.

의존 프로퍼티 정의 방법

DependencyProperty.Register 메서드를 사용하여 의존 프로퍼티를 등록합니다.

일반적인 .NET 속성과 의존 프로퍼티의 차이점은 의존 프로퍼티는 메모리에 저장되지 않고, DependencyObject에 의해 관리된다는 점입니다

using System.Windows;
using System.Windows.Controls;

namespace WpfApp
{
    public class MyCustomControl : Control
    {
        // 1. 의존 프로퍼티 등록
        public static readonly DependencyProperty MyPropertyProperty =
            DependencyProperty.Register(
                "MyProperty",                      // 프로퍼티 이름
                typeof(string),                    // 프로퍼티 타입
                typeof(MyCustomControl),           // 소유하는 클래스
                new PropertyMetadata("Default"));  // 기본값 설정

        // 2. CLR 래퍼 정의 (일반적인 .NET 프로퍼티처럼 사용 가능)
        public string MyProperty
        {
            get { return (string)GetValue(MyPropertyProperty); }
            set { SetValue(MyPropertyProperty, value); }
        }
    }
}

 

- XAML 예

<Window x:Class="WpfApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApp"
        Title="MainWindow" Height="200" Width="200">
    <Grid>
        <local:MyCustomControl MyProperty="Hello, World!" />
    </Grid>
</Window>

 

일반 프로퍼티 (특히 윈폼.Winform) 쓰는거랑 차이는?

WPF의 의존 프로퍼티(Dependency Property)와 Windows Forms(WinForms)의 일반 프로퍼티는 비슷한 역할을 하지만,

그 동작 방식과 기능에 큰 차이가 있습니다. 이 차이는 주로 WPF의 고유한 기능들과 성능 최적화 때문에 발생합니다.

주요 차이점

1. 데이터 저장 방식

  • WinForms: 일반적으로 WinForms에서 사용되는 프로퍼티는 해당 클래스의 필드에 값을 저장합니다. 즉, 값이 메모리에 직접 저장됩니다.
  • WPF: 의존 프로퍼티는 실제로 클래스의 필드에 저장되지 않고, **DependencyObject**라는 클래스가 관리하는 전역 테이블에 의해 관리됩니다. 이를 통해 메모리 사용을 최적화하고 프로퍼티 변경 시 추가적인 기능을 제공합니다.

2. 데이터 바인딩

  • WinForms: 일반 프로퍼티는 기본적으로 데이터 바인딩을 지원하지 않습니다. WinForms에서 데이터 바인딩을 하려면 INotifyPropertyChanged 인터페이스를 구현하거나 별도의 수작업 설정이 필요합니다.
  • WPF: 의존 프로퍼티는 데이터 바인딩을 위해 설계되었습니다. WPF의 데이터 바인딩 시스템은 의존 프로퍼티에 기본적으로 통합되어 있어, 자동으로 UI와 데이터 모델 간의 동기화가 가능합니다.

3. 속성 값의 변경 감지 및 알림

  • WinForms: 일반적으로 프로퍼티 값이 변경되면 이를 감지하려면 이벤트를 수동으로 발생시키거나 NotifyPropertyChanged를 구현해야 합니다.
  • WPF: 의존 프로퍼티는 속성 값의 변경을 자동으로 감지합니다. PropertyChangedCallback과 같은 메커니즘을 통해 속성이 변경될 때 자동으로 이벤트를 처리할 수 있습니다.

4. 스타일 및 트리거

  • WinForms: WinForms에서는 스타일이나 트리거를 통해 프로퍼티의 동작을 제어하는 기능이 없습니다.
  • WPF: WPF는 의존 프로퍼티를 통해 스타일트리거를 지원합니다. 이를 통해 UI 요소의 상태에 따라 프로퍼티 값을 자동으로 변경하거나 트리거를 사용할 수 있습니다.

5. 애니메이션

  • WinForms: 일반적인 프로퍼티는 애니메이션 기능을 지원하지 않습니다. 애니메이션을 구현하려면 타이머나 다른 메커니즘을 사용해야 합니다.
  • WPF: 의존 프로퍼티는 WPF의 애니메이션 시스템과 통합되어 있어, 값이 시간에 따라 애니메이션을 통해 자연스럽게 변경될 수 있습니다.

6. 성능 최적화

  • WinForms: 일반 프로퍼티는 메모리에서 직접 값을 저장하고 읽기 때문에, 성능 최적화를 위한 특별한 메커니즘이 없습니다.
  • WPF: 의존 프로퍼티는 성능 최적화를 염두에 두고 설계되었습니다. 값이 사용되지 않을 경우 메모리에 저장되지 않으며, 메모리 소비를 줄이기 위해 속성 값이 전역적으로 관리됩니다.
public class MyWinFormsControl : Control
{
    private string myProperty;

    public string MyProperty
    {
        get { return myProperty; }
        set
        {
            myProperty = value;
            // 값이 변경되었을 때 수동으로 UI 업데이트 필요
            this.Invalidate();
        }
    }
}

 

WPF에서의 의존 프로퍼티

using System.Windows;
using System.Windows.Controls;

public class MyWpfControl : Control
{
    public static readonly DependencyProperty MyPropertyProperty =
        DependencyProperty.Register("MyProperty", typeof(string), typeof(MyWpfControl),
            new PropertyMetadata("Default", OnMyPropertyChanged));

    public string MyProperty
    {
        get { return (string)GetValue(MyPropertyProperty); }
        set { SetValue(MyPropertyProperty, value); }
    }

    private static void OnMyPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        // 값 변경 시 자동으로 UI 반영 가능
    }
}

 

 

  • WinForms: 일반 프로퍼티는 값 저장 및 사용이 단순하며, 메모리에서 직접 값을 관리합니다. 자동적인 데이터 바인딩, 스타일, 트리거, 애니메이션과 같은 기능이 없습니다.
  • WPF: 의존 프로퍼티는 데이터 바인딩, 스타일, 트리거, 애니메이션, 성능 최적화 등을 염두에 두고 설계된 복잡한 시스템입니다. 일반 프로퍼티보다 훨씬 강력한 기능을 제공하며, 특히 WPF의 핵심 기능인 데이터 바인딩과 스타일 시스템에 필수적입니다.

WPF에서는 의존 프로퍼티를 통해 훨씬 더 많은 기능과 유연성을 제공하며, 복잡한 UI와 상호작용을 효율적으로 처리할 수 있습니다