ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • C# WPF에서 Binding(바인딩)이란?
    닷넷/WPF 2023. 4. 7. 18:17
    반응형

    WPF에서는 MVVM 패턴을 지키는 게 중요합니다. 개인적으로 생각하기에는 이 MVVM 패턴대로 만들지 않을 것이라면 개발 속도로 봤을 때나 유지보수 적으로 봤을 때나 그냥 윈폼(WinForms)으로 만드는게 낫습니다.
    따라서 바인딩은 MVVM 패턴을 지키며 WPF에서 애플리케이션을 만들 때 중요한 요소가 됩니다.
    왜냐하면 WPF에서 바인딩(Binding)은 데이터 소스와 UI 요소 간의 연결을 뜻하기 때문입니다. 즉, 뷰와 뷰모델의 연결점입니다.
     
    바인딩을 사용하면 소스의 데이터가 변경될 때 UI가 자동으로 업데이트되고, 반대로 UI에서의 변경 사항이 소스에 전달됩니다. 이렇게 함으로써 데이터와 UI 간의 동기화가 유지되어 개발자가 수동으로 UI를 업데이트할 필요가 없습니다.


    WPF에서는 XAML (eXtensible Application Markup Language)에 바인딩을 정의할 수 있습니다. 
    바인딩은 주로 속성(Property)에 연결되며 Binding 클래스를 사용해 구현됩니다. 바인딩은 단방향 또는 양방향으로 설정할 수 있습니다.

    예를 들어, WPF 애플리케이션에서 텍스트박스의 내용을 ViewModel의 속성과 바인딩하려면 다음과 같은 XAML 코드를 작성할 수 있습니다.

    <TextBox Text="{Binding Path=ExampleProperty, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />

     여기서 Text 속성은 텍스트박스의 내용을 나타내며, Binding에 ViewModel의 ExampleProperty 속성명을 입력합니다. 참고로 Mode=TwoWay는 양방향 바인딩을 뜻하며, UpdateSourceTrigger=PropertyChanged는 소스의 속성 값이 변경될 때마다 UI가 업데이트되도록 설정하는 것을 뜻합니다.


    그다음 뷰모델에서는 INotifyPropertyChanged 인터페이스를 구현해야 합니다. 
    이 인터페이스는 속성 변경 알림을 제공하며, 속성이 변경될 때마다 PropertyChanged 이벤트를 발생시켜 바인딩된 UI 요소를 자동으로 업데이트합니다.
     
    뷰모델에서 INotifyPropertyChanged 인터페이스를 구현하는 예시는 다음과 같습니다.

    using System.ComponentModel;
    using System.Runtime.CompilerServices;
    
    public class MyViewModel : INotifyPropertyChanged
    {
        private string _exampleProperty;
    
        public event PropertyChangedEventHandler PropertyChanged;
    
        public string ExampleProperty
        {
            get { return _exampleProperty; }
            set
            {
                if (_exampleProperty != value)
                {
                    _exampleProperty = value;
                    OnPropertyChanged();
                }
            }
        }
    
        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    여기서는 MyViewModel에 INotifyPropertyChanged 인터페이스를 구현하여 사용하고 있으나 CommunityToolkit, Prism, DevExpress 등등에서 제공되는 것을 사용하거나 Base 뷰모델을 만들어서 거기에 구현하고, 상속해서 사용할 수도 있습니다.

    ExampleProperty 속성은 뷰의 바인딩과 연결되며, 값이 변경되면 OnPropertyChanged 메서드를 호출해 PropertyChanged 이벤트를 발생시킵니다.

    그 다음 뷰모델을 뷰의 데이터 컨텍스트(DataContext)로 설정해야 합니다. 이렇게 하면 뷰에서 정의된 바인딩이 뷰모델의 속성과 자동으로 연결됩니다.

    public partial class MyView : Window
    {
        public MyView()
        {
            InitializeComponent();
            DataContext = new MyViewModel();
        }
    }

    뷰의 DataContext에 뷰모델을 설정하는 방법은 다양한 방법이 있지만 위의 예제 코드는 그 중의 하나로  MyView의 코드 비하인드에서 생성자에 MyViewModel의 인스턴스를 생성하고 뷰의 DataContext에 대입합니다. 이렇게 함으로써 뷰와 뷰모델 간의 바인딩이 설정됩니다.

    이제 뷰에서 정의한 XAML 바인딩이 뷰모델의 ExampleProperty 속성과 연결되며, 해당 속성이 변경되면 자동으로 UI가 업데이트됩니다.
     
    더 자세한 내용은 Microsoft Learn의 데이터 바인딩 개요(WPF .NET)에서 확인 할 수 있습니다.

    반응형

    댓글

Designed by Tistory.