23.데이터 바인딩과 데이터 템플릿을 활용한 효율적인 UI 설계, WPF의 데이터 바인딩 기초

WPF(Windows Presentation Foundation)는 마이크로소프트에서 제공하는 애플리케이션 프레임워크로,
풍부한 사용자 인터페이스를 구축하기 위해 데이터를 시각적으로 표현하는 다양한 기술을 지원합니다.
이 중 데이터 바인딩과 데이터 템플릿은 UI 설계에서 중요한 역할을 하며, 효율적이고 유지보수 용이한 코드 작성을 가능하게 합니다.

1. 데이터 바인딩이란?

데이터 바인딩은 UI 요소와 데이터 소스 간의 연결을 의미합니다. WPF에서는 데이터 바인딩을 통해
UI 컨트롤이 데이터 소스(예: 컬렉션, 클래스, 속성 등)의 변화를 자동으로 감지하고 이에 따라 UI를 업데이트합니다.
이를 통해 개발자는 UI에 데이터를 수동으로 할당할 필요가 없고, 데이터의 변경에 대한 처리 로직을 분리할 수 있습니다.

1.1 데이터 바인딩의 장점

  • 코드의 간결성: UI와 비즈니스 로직 분리가 용이해 코드가 더욱 간결해집니다.
  • 유지보수성: 데이터와 UI의 결합도가 낮아 코드 수정이 용이합니다.
  • 실시간 데이터 반영: 데이터의 변경 시 UI가 자동으로 업데이트됩니다.

2. WPF에서의 데이터 바인딩 기초

WPF의 데이터 바인딩은 다음과 같은 몇 가지 기본 요소로 구성됩니다.

2.1 데이터 소스

데이터 소스는 UI에 바인딩되는 데이터의 출처를 의미합니다. 이는 객체, 리스트, 또는 데이터베이스와 같이
다양한 형태가 될 수 있습니다. 데이터 소스를 선정할 때는 바인딩 가능한 속성을 가진 클래스를 활용하는 것이 좋습니다.

2.2 바인딩 대상(UI 요소)

바인딩 대상은 데이터 소스의 정보를 표시하는 WPF의 UI 요소입니다. 예를 들어, TextBox, ListBox, ComboBox
등이 이에 해당합니다.

2.3 바인딩 표현식

바인딩 표현식은 데이터 소스와 UI 요소 간의 연결을 정의하는 방식입니다. WPF에서는 XAML을 사용하여
바인딩을 정의할 수 있습니다.

예제: 간단한 데이터 바인딩


<Window x:Class="WpfApp.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="200" Width="400">
    <Grid>
        <TextBox Text="{Binding Name}" Width="200" Height="30" />
        <Button Content="Submit" Width="100" Height="30" 
                VerticalAlignment="Bottom" Click="Submit_Click"/>
    </Grid>
</Window>

3. 데이터 템플릿(DataTemplate)

데이터 템플릿은 데이터 항목의 시각적 표현을 정의하는 방법으로, 특히 리스트와 같은 컬렉션을 표시할 때 매우 유용합니다.
데이터 템플릿을 사용하면 다양한 데이터 구조를 직관적으로 쉽게 표현할 수 있습니다.

3.1 데이터 템플릿의 기본 구성

데이터 템플릿은 XAML 내에서 사용되며, 특정 데이터 타입에 대한 UI의 구조를 정의합니다. WPF는 기본 제공 데이터 템플릿 및 사용자가 정의한 데이터 템플릿 모두 지원합니다.

예제: 데이터 템플릿 활용하기


<Window x:Class="WpfApp.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="300" Width="400">
    <Window.Resources>
        <DataTemplate x:Key="PersonTemplate">
            <StackPanel>
                <TextBlock Text="{Binding Name}" FontWeight="Bold" />
                <TextBlock Text="{Binding Age}" />
            </StackPanel>
        </DataTemplate>
    </Window.Resources>
    <Grid>
        <ListBox ItemTemplate="{StaticResource PersonTemplate}" 
                 ItemsSource="{Binding People}" />
    </Grid>
</Window>

4. 데이터 바인딩의 심화

WPF의 데이터 바인딩은 단순한 표현을 넘어 통합된 데이터 모델을 이용한 복잡한 데이터 흐름을 지원합니다.
이 절에서는 데이터 바인딩의 심화 개념인 Two-Way Binding, INotifyPropertyChanged,
BindingMode에 대해 다루겠습니다.

4.1 Two-Way Binding

Two-Way Binding은 데이터 소스와 UI 간의 양방향 통신을 가능하게 합니다. 즉, UI에서의 변화가 데이터 소스에 반영되고,
데이터 소스의 변화가 UI에 반영됩니다. 이를 통해 사용자 인터랙션이 더 자연스럽고 직관적입니다.

예제: Two-Way Binding 구현


<TextBox Text="{Binding Name, Mode=TwoWay}" Width="200" Height="30" />

4.2 INotifyPropertyChanged 인터페이스

INotifyPropertyChanged는 데이터 모델이 변경되었음을 UI에 통지하는데 사용되는 인터페이스입니다. 이 인터페이스를 구현함으로써,
속성 값이 변경될 때 UI가 업데이트되도록 할 수 있습니다.

예제: INotifyPropertyChanged 구현


public class Person : INotifyPropertyChanged
{
    private string name;
    public string Name
    {
        get { return name; }
        set
        {
            name = value;
            OnPropertyChanged("Name");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

4.3 BindingMode

BindingMode는 데이터 바인딩의 방향성을 정의하며, 다음과 같은 세 가지 모드를 제공합니다:

  • OneWay: 데이터 소스에서 UI로만 데이터가 전달됩니다.
  • TwoWay: 데이터 소스와 UI 간에 데이터가 양방향으로 전달됩니다.
  • OneTime: 데이터 소스가 초기화될 때만 UI에 값을 할당합니다.

5. 결론

WPF의 데이터 바인딩과 데이터 템플릿 기능은 효율적이고 유연한 UI 설계를 가능하게 합니다. 이 기술을 활용하면 제조 실행 시스템(MES)과 같은 복잡한 어플리케이션에서
사용자가 이해하기 쉬운 방식으로 데이터를 표시하고 관리할 수 있습니다. 앞으로의 프로젝트에서는 이러한 데이터 바인딩 기술을 적극적으로 활용하여,
유지보수성과 사용자 경험을 향상시키는 방향으로 나아가길 바랍니다.