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();
}
}
위의 예제에서 RelayCommand
는 ICommand
인터페이스를 구현하고, Execute
와 CanExecute
메서드를 통해 명령을 처리합니다. 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 애플리케이션을 더욱 구조적이고 유지보수하기 쉬운 형태로 개발할 수 있습니다.