C#

C# WPF Command 패턴과 RelayCommand 사용법

samie 2025. 3. 30. 11:00
C# WPF Command 패턴과 RelayCommand 사용법

C# WPF Command 패턴과 RelayCommand 사용법

WPF(Windows Presentation Foundation)에서 Command 패턴은 사용자 인터페이스(UI)와 비즈니스 로직을 분리하는 중요한 디자인 패턴입니다. 이 글에서는 WPF에서 Command 패턴과 RelayCommand 사용법에 대해 설명합니다. Command 패턴은 MVVM(Model-View-ViewModel) 패턴을 구현하는 데 매우 유용하며, 사용자 인터페이스의 버튼 클릭, 메뉴 선택 등과 같은 동작을 처리하는 데 사용됩니다.

1. Command 패턴이란?

Command 패턴은 행동 디자인 패턴 중 하나로, 요청을 객체로 캡슐화하여 사용자가 원하는 작업을 수행하도록 하는 방식입니다. WPF에서는 Command 패턴을 통해 UI에서 발생한 이벤트를 처리하는 로직을 ViewModel로 전달하고, UI와 비즈니스 로직을 분리합니다. 이로써 코드의 재사용성 및 유지보수성을 향상시킬 수 있습니다.

2. WPF에서 Command 패턴의 중요성

WPF에서 Command 패턴은 UI 요소와 그에 대응하는 로직을 분리하는 데 사용됩니다. 예를 들어, 버튼 클릭, 키 입력, 마우스 동작 등은 모두 Command 객체로 처리됩니다. View는 Command를 호출만 하면 되고, 실제 동작은 ViewModel에서 정의된 Command 객체가 처리합니다. 이 방식은 MVVM 패턴을 구현하는 데 필수적인 요소입니다.

3. RelayCommand란?

RelayCommand는 ICommand 인터페이스를 구현한 클래스로, WPF에서 Command 패턴을 구현하는 데 매우 유용합니다. RelayCommand는 주로 명령을 처리하는 델리게이트를 사용하여 비즈니스 로직을 ViewModel에서 처리할 수 있도록 돕습니다. 또한, 이 명령은 실행 가능 여부를 판단하는 로직도 함께 구현할 수 있어 유연한 제어가 가능합니다.

RelayCommand 클래스 구현 예제

public class RelayCommand : ICommand
{
    private readonly Action _execute;
    private readonly Predicate<object> _canExecute;

    public RelayCommand(Action execute, Predicate<object> canExecute = null)
    {
        _execute = execute ?? throw new ArgumentNullException(nameof(execute));
        _canExecute = canExecute;
    }

    public event EventHandler CanExecuteChanged
    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }

    public bool CanExecute(object parameter)
    {
        return _canExecute == null || _canExecute(parameter);
    }

    public void Execute(object parameter)
    {
        _execute();
    }
}

위의 예제에서 RelayCommandICommand 인터페이스를 구현하고, ExecuteCanExecute 메서드를 통해 명령을 처리합니다. Execute는 실제 동작을 수행하며, CanExecute는 명령이 실행 가능한지 여부를 판단합니다.

4. RelayCommand 사용 예제

이제 실제로 RelayCommand를 WPF에서 어떻게 사용할 수 있는지 살펴보겠습니다. 예를 들어, 버튼을 클릭할 때 특정 작업을 수행하는 명령을 구현해 보겠습니다.

public class MainViewModel
{
    public ICommand MyCommand { get; set; }

    public MainViewModel()
    {
        MyCommand = new RelayCommand(ExecuteCommand, CanExecuteCommand);
    }

    private void ExecuteCommand()
    {
        // 명령 실행 시 처리할 로직
        MessageBox.Show("버튼이 클릭되었습니다!");
    }

    private bool CanExecuteCommand(object parameter)
    {
        // 명령 실행 가능 여부를 반환
        return true;
    }
}

위 코드에서 MainViewModel 클래스는 RelayCommand 객체를 사용하여 MyCommand라는 명령을 정의합니다. 버튼 클릭 시 ExecuteCommand 메서드가 호출되고, CanExecuteCommand 메서드에서 명령 실행 가능 여부를 판단합니다.

XAML에서 RelayCommand 연결하기

<Button Content="Click Me" Command="{Binding MyCommand}" />

위 XAML 코드는 Button을 클릭할 때 MyCommand가 실행되도록 연결한 예제입니다. ViewModel에서 정의한 명령을 XAML에서 바인딩하여 UI와 로직을 분리합니다.

5. Command 패턴을 사용한 MVVM 구현

Command 패턴은 MVVM(Model-View-ViewModel) 패턴에서 중요한 역할을 합니다. View는 Command를 통해 이벤트를 ViewModel에 전달하고, ViewModel은 명령을 처리하여 UI를 업데이트합니다. 이렇게 함으로써 UI와 비즈니스 로직을 완벽하게 분리할 수 있으며, 코드의 유지보수성도 높아집니다.

6. 마무리

WPF에서 Command 패턴과 RelayCommand는 UI와 비즈니스 로직을 분리하여 효율적인 개발을 가능하게 합니다. Command 패턴을 통해 버튼 클릭, 키 입력 등의 이벤트를 처리하고, RelayCommand를 사용하여 명령의 실행과 조건을 처리할 수 있습니다. 이를 통해 WPF 애플리케이션을 더욱 구조적이고 유지보수하기 쉬운 형태로 개발할 수 있습니다.