WPF 개발, 연습 제품 및 세부 정보 표시

WPF(Windows Presentation Foundation)는 .NET Framework를 기반으로 한 강력한 UI 프레임워크입니다. 특히
데스크톱 애플리케이션을 개발하는 데 적합한 플랫폼입니다. 이번 강좌에서는 WPF를 사용하여 제품 목록과
정보 세부사항을 표시하는 방법에 대해 자세히 알아보겠습니다. 이 강좌에서 배울 내용은 제품 데이터 바인딩,
MVVM(모델-뷰-뷰모델) 패턴 구현, XAML을 사용한 UI 디자인 등의 주제를 포함합니다.

1. 준비 작업

WPF 애플리케이션을 만들기 위해 우선 Visual Studio를 설치하고, 새로운 WPF 애플리케이션 프로젝트를 생성해야 합니다.
아래의 단계에 따라 새 프로젝트를 설정해 보겠습니다.

  1. Visual Studio를 실행합니다.
  2. 파일 메뉴에서 새로 만들기 -> 프로젝트를 선택합니다.
  3. 프로젝트 템플릿에서 WPF 앱 (.NET Core) 또는 WPF 앱 (.NET Framework)를 선택합니다.
  4. 프로젝트 이름과 저장 경로를 지정한 후 만들기를 클릭합니다.

2. MVVM 패턴 이해하기

MVVM(Model-View-ViewModel) 패턴은 WPF에서 주로 사용되는 아키텍처 패턴으로, 사용자 인터페이스(UI)를
비즈니스 로직과 분리하여 관리하는 데 도움을 줍니다. 이 패턴의 세 가지 구성 요소는 다음과 같습니다:

  • Model: 비즈니스 로직과 데이터.
  • View: 사용자 인터페이스.
  • ViewModel: View와 Model 간의 중재자 역할.

이 강좌에서는 간단한 제품 정보 애플리케이션을 만들며 MVVM 패턴을 적용할 것입니다.

3. 데이터 모델 생성

먼저, 제품 정보를 담을 Product 클래스를 만들어 보겠습니다. 이 클래스는 제품의 이름, 가격,
설명 등을 속성으로 가집니다.

using System.ComponentModel;

public class Product : INotifyPropertyChanged
{
    private string _name;
    private decimal _price;
    private string _description;

    public string Name
    {
        get => _name;
        set
        {
            _name = value;
            OnPropertyChanged(nameof(Name));
        }
    }

    public decimal Price
    {
        get => _price;
        set
        {
            _price = value;
            OnPropertyChanged(nameof(Price));
        }
    }

    public string Description
    {
        get => _description;
        set
        {
            _description = value;
            OnPropertyChanged(nameof(Description));
        }
    }

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

위의 코드는 INotifyPropertyChanged 인터페이스를 구현하여 속성이 변경될 때 통지를
받을 수 있도록 합니다. 이는 데이터 바인딩에 유용합니다.

4. ViewModel 생성

다음으로, ProductViewModel 클래스를 생성하여 제품 목록을 관리하는 로직을 구현합니다.
이 ViewModel은 제품의 목록을 포함하고 있으며, 사용자가 선택한 제품의 세부 정보를 표시합니다.

using System.Collections.ObjectModel;
using System.Windows.Input;

public class ProductViewModel : INotifyPropertyChanged
{
    private Product _selectedProduct;

    public ObservableCollection<Product> Products { get; }

    public Product SelectedProduct
    {
        get => _selectedProduct;
        set
        {
            _selectedProduct = value;
            OnPropertyChanged(nameof(SelectedProduct));
        }
    }

    public ProductViewModel()
    {
        Products = new ObservableCollection<Product>
        {
            new Product { Name = "노트북", Price = 1200000, Description = "고성능 노트북입니다." },
            new Product { Name = "스마트폰", Price = 800000, Description = "최신 스마트폰입니다." },
            new Product { Name = "태블릿", Price = 500000, Description = "휴대성이 뛰어난 태블릿입니다." }
        };
    }

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

여기서는 ObservableCollection<Product>을 사용하여 제품 목록을 관리합니다.
ObservableCollection은 컬렉션이 변경될 때 UI에 자동으로 반영합니다.

5. XAML을 활용한 UI 디자인

이제 XAML을 이용해 사용자 인터페이스를 디자인해 보겠습니다. 아까 생성한
ProductViewModel와 데이터 바인딩하여 UI를 구성합니다.

<Window x:Class="ProductApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="제품 목록" Height="350" Width="525">
    <Window.DataContext>
        <local:ProductViewModel />
    </Window.DataContext>

    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="2*"/>
            <ColumnDefinition Width="3*"/>
        </Grid.ColumnDefinitions>

        <ListBox ItemsSource="{Binding Products}" 
                 SelectedItem="{Binding SelectedProduct}" 
                 DisplayMemberPath="Name" 
                 Margin="10" />

        <StackPanel Grid.Column="1" Margin="10">
            <TextBlock Text="제품명:" FontWeight="Bold"/>
            <TextBlock Text="{Binding SelectedProduct.Name}" />

            <TextBlock Text="가격:" FontWeight="Bold"/>
            <TextBlock Text="{Binding SelectedProduct.Price, StringFormat={}{0:C}}" />

            <TextBlock Text="설명:" FontWeight="Bold"/>
            <TextBlock Text="{Binding SelectedProduct.Description}" TextWrapping="Wrap" />
        </StackPanel>

    </Grid>
</Window>

위의 XAML 코드에서는 기본적인 레이아웃을 구성하고 ListBox를 사용하여 제품 목록을 표시합니다.
사용자가 ListBox에서 제품을 선택하면 선택한 제품의 세부 정보가 오른쪽 영역에 나타납니다.

6. 애플리케이션 실행 및 결과 확인

모든 코드 작성이 완료되었으므로 애플리케이션을 실행하여 결과를 확인해 보겠습니다.
F5 키를 눌러 디버깅 모드로 실행하면 아래와 같은 UI를 확인할 수 있습니다.

제품 목록 애플리케이션

7. 결론

이번 강좌에서는 WPF를 사용하여 간단한 제품 목록 및 세부 정보 애플리케이션을 만들었습니다.
MVVM 패턴을 적용하여 Model, View, ViewModel을 분리함으로써 코드의 가독성과 유지보수성을 높였습니다.
WPF의 데이터 바인딩 기능을 활용하여 사용자 인터페이스와 비즈니스 로직 간의 연결을 수월하게 구현할 수 있었습니다.
이 강좌를 통해 WPF의 기본적인 데이터 바인딩 및 MVVM에 대한 이해를 높일 수 있었기를 바랍니다.

앞으로 더욱 복잡하고 다양한 WPF 애플리케이션을 개발해 나가시길 바랍니다.
WPF의 다양한 기능을 활용하여 더욱 매력적인 사용자 인터페이스를 구현하세요!