[Day 10] Commands 소개 및 구현
안녕하세요! 이번 포스트에서는 WPF에서 사용되는 Commands에 대해서 알아보겠습니다.
Commands란?
Commands는 사용자 인터페이스에서 실행 가능한 작업을 캡슐화하는 객체입니다. 예를 들어, 사용자가 버튼을 클릭하거나 키보드 단축키를 누르면 애플리케이션에서 실행되는 작업을 캡슐화할 수 있습니다.
Commands는 명령(Command), 명령 타겟(Command Target) 및 명령 수행(Command Execution)으로 구성됩니다. 명령은 실행 가능한 작업을 캡슐화하는 객체이며, 명령 타겟은 명령을 수행할 UI 요소입니다. 명령 수행은 ICommand 인터페이스를 구현하여 수행됩니다.
ICommand 인터페이스
ICommand 인터페이스는 Commands의 실행을 처리하는 메서드를 정의합니다. ICommand는 CanExecute(object parameter) 및 Execute(object parameter) 메서드를 정의합니다.
CanExecute 메서드는 명령이 현재 실행 가능한지 여부를 반환합니다. Execute 메서드는 명령이 실행되면 호출됩니다.
Commands 구현하기
Commands를 구현하려면 ICommand 인터페이스를 구현하는 클래스를 작성해야합니다. 이 클래스는 Execute 및 CanExecute 메서드를 구현해야합니다. 또한, 명령을 사용하는 UI 요소에서는 Command 속성과 CommandParameter 속성을 설정해야합니다.
간단한 예제를 통해 Commands를 구현하는 방법을 살펴보겠습니다.
먼저, ICommand 인터페이스를 구현하는 클래스를 만들어야합니다. 아래는 간단한 Command 클래스입니다.
public class SimpleCommand : ICommand
{
private readonly Action<object> execute;
private readonly Func<object, bool> canExecute;
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
public SimpleCommand(Action<object> execute, Func<object, bool> canExecute = null)
{
this.execute = execute;
this.canExecute = canExecute;
}
public bool CanExecute(object parameter)
{
return _canExecute == null ? true : _canExecute(parameter);
}
public void Execute(object parameter)
{
execute(parameter);
}
public event EventHandler CanExecuteChanged;
}
SimpleCommand 클래스는 ICommand 인터페이스를 구현합니다. 생성자에서 Execute와 CanExecute 메서드를 받아들입니다.
CanExecute 메서드에서는 명령이 실행 가능한지 여부를 반환합니다. CanExecute 매개 변수가 null이면 항상 true를 반환합니다.
Execute 메서드에서는 명령을 실행합니다. Execute 매개 변수가 null이면 메서드는 아무 작업도 수행하지 않습니다.
그리고 마지막으로 CanExecuteChanged 이벤트를 정의합니다. 이 이벤트는 명령이 실행 가능한지 여부가 변경될 때 발생합니다. 이벤트를 발생시켜 적절한 UI 엘리먼트의 상태를 업데이트 할 수 있습니다.
위 코드에서 CanExecuteChanged 이벤트는 CommandManager.RequerySuggested 이벤트와 연결됩니다. 이 이벤트는 WPF가 레이아웃과 이벤트를 처리할 때마다 자동으로 발생합니다.
마지막으로, 명령의 실행 가능성이 변경되었을 때 CanExecuteChanged 이벤트를 발생시킵니다. 이는 명령의 CanExecute 메소드에서 반환값이 변경되었을 때 발생해야합니다.
CanExecuteChanged 이벤트가 발생할 때마다 CommandManager.RequerySuggested 이벤트가 호출되어 명령의 CanExecute 메소드를 호출합니다. 따라서 CanExecute 메소드가 반환하는 값이 변경되면 CommandManager.RequerySuggested 이벤트가 발생하고 UI 엘리먼트의 상태가 업데이트됩니다.
이제 RelayCommand 클래스가 완성되었습니다. 이 클래스를 사용하여 UI 컨트롤의 이벤트 처리를 쉽게 구현할 수 있습니다.
아래는 ICommand 인터페이스의 코드 예시입니다.
public interface ICommand
{
// Command가 실행 가능한지 여부를 반환하는 CanExecute 메서드
bool CanExecute(object parameter);
// Command를 실행하는 Execute 메서드
void Execute(object parameter);
// CanExecute의 결과가 변경될 때마다 호출되는 이벤트
event EventHandler CanExecuteChanged;
}
그리고 위에 코드들을 이용해서 CommandBinding을 설정할 수 있습니다. 아래는 CommandBinding의 예시입니다.
Button myButton = new Button();
SimpleCommand myCommand = new SimpleCommand(ExecuteMethod, CanExecuteMethod);
CommandBinding myCommandBinding = new CommandBinding(myCommand);
myButton.Command = myCommand;
myButton.CommandBinding = myCommandBinding;
결론
이번 10일차에서는 WPF에서 사용되는 Commands에 대해 배웠습니다. Commands는 이전에 배운 이벤트와는 다른 개념으로, 뷰와 뷰모델 사이에서 발생하는 사용자 인터페이스 동작을 처리하는 데 사용됩니다.
ICommand 인터페이스를 상속받아서 CanExecute와 Execute 메서드를 구현하면, 해당 명령을 처리하는 클래스를 만들 수 있습니다. 또한 이를 사용하기 위해서는 CommandBinding을 설정해야 합니다.
Commands를 사용하면 XAML에서 뷰모델의 메서드를 직접 호출하지 않고, 뷰모델의 데이터와 상호작용하면서 사용자 인터페이스를 처리할 수 있습니다. 이는 MVVM 디자인 패턴을 구현하는 데 매우 유용합니다.
이번 포스트에서는 ICommand 인터페이스의 구현 예시와 CommandBinding 설정 방법을 살펴보았습니다. Commands는 WPF에서 매우 중요한 개념이므로, 이번 포스트에서 다룬 내용을 잘 숙지하시기 바랍니다. 다음 포스트에서는 데이터베이스 연동에 대해 배워보겠습니다.
'Languages > C#' 카테고리의 다른 글
C# WPF Path 그리기(1) (0) | 2023.04.12 |
---|---|
Day 11: 데이터베이스 연동 - MongoDB 설치 및 연결 (0) | 2023.04.12 |
C# DataTable 사용법(2) (0) | 2023.04.11 |
C# DataTable 사용법(1) (0) | 2023.04.11 |
C# Dictionary(사전 구조) (0) | 2023.04.11 |