반응형
해당 포스팅은 개인적으로 C# WPF를 공부하면서 익힌 내용을 기억에 남기기 위한 작업의 일환으로 작성된 글로서
일부 내용에 오류가 있을 수도 있으니 참고하시기 바랍니다.

 

 

C#WPF 프로그래밍을 할때,RelayCommand를
정의해주고 UI에서 만든 Button과 연결하여
사용하는 경우가 많은데,
 그러한 RelayCommand에서
사용하는 함수에 대해
알아보자.

 

내용 요약

 

C# WPF의 RelayCommand에서 자주 사용하는 Delegate, Action, Func에 대해 설명하겠습니다. 이 개념들은 WPF에서 MVVM 패턴을 구현할 때 중요하게 사용됩니다.

목차
1.Delegate
2.Action
3.Func
4.RelayCommand에서 Action과 Func의 역할
5.RelayCommand 사용 예시

 

1. Delegate (델리게이트)

Delegate는 C#에서 메서드를 참조하는 형식입니다. 특정 메서드의 참조를 저장하고 그 메서드를 나중에 호출할 수 있습니다. 덕분에 메서드를 변수처럼 다룰 수 있으며, 메서드를 인수로 전달하거나 이벤트 핸들링에서 사용됩니다.

// Delegate 선언
public delegate void MyDelegate(string message);

// Delegate 사용 예시
public class MyClass
{
    public void PrintMessage(string message)
    {
        Console.WriteLine(message);
    }
}

MyDelegate del = new MyClass().PrintMessage;
del("Hello, Delegate!");  // 출력: Hello, Delegate!

2. Action

Action은 리턴값이 없는 메서드를 참조하는 델리게이트입니다.

여러 개의 매개변수를 받을 수 있지만

리턴 타입이 void라는 특징이 있습니다.

 

// 매개변수 없는 Action 예시
Action action = () => Console.WriteLine("No parameters");
action();  // 출력: No parameters

// 매개변수 있는 Action 예시
Action<int, string> action = (x, y) => Console.WriteLine($"{x}, {y}");
action(5, "Hello");  // 출력: 5, Hello

3. Func

Func은 리턴값이 있는 메서드를 참조하는 델리게이트입니다.

마지막 매개변수가 리턴 타입을 나타내며,

0개 이상의 매개변수를 받을 수 있습니다.

 

// 리턴값 있는 Func 예시
Func<int> getNumber = () => 42;
int result = getNumber();  // 결과: 42

Func<int, int, int> addNumbers = (a, b) => a + b;
int sum = addNumbers(5, 3);  // 결과: 8

4. RelayCommand에서 Action과 Func의 역할

RelayCommand는 WPF에서 MVVM 패턴을 구현할 때

버튼 클릭 등의 UI 동작을 처리하기 위해 사용됩니다.

ActionFunc는 RelayCommand 내부에서

명령 실행 로직과 실행 가능 여부를

결정하는 함수로 사용됩니다.

public class RelayCommand : ICommand
{
    private readonly Action _execute;        // 명령 실행
    private readonly Func<bool> _canExecute; // 실행 가능 여부 판단

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

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

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

1. Action _execute

_execute는 실제 명령을 실행하는 코드 블록을 참조하며,

사용자 동작(예: 버튼 클릭)을 수행할 때

실행할 동작을 정의합니다.

 

2. Func<bool> _canExecute

_canExecute는 명령이 실행 가능한지 여부를 판단하는 함수로, bool 값을 반환합니다.

 

5. RelayCommand 사용 예시

public class MainViewModel
{
    public RelayCommand GeneratePostCommand { get; }
    public RelayCommand PostToNaverCommand { get; }

    public MainViewModel()
    {
        // Action을 통한 명령 실행 메서드
        GeneratePostCommand = new RelayCommand(GeneratePost);

        // Func<bool>을 통한 조건 추가
        PostToNaverCommand = new RelayCommand(PostToNaver, CanPostToNaver);
    }

    private void GeneratePost()
    {
        Console.WriteLine("Generating Post...");
    }

    private void PostToNaver()
    {
        Console.WriteLine("Posting to Naver...");
    }

    private bool CanPostToNaver()
    {
        return !string.IsNullOrEmpty(GeneratedPost);
    }
}

 

내용 정리
  • Delegate: C#에서 메서드를 참조하는 형식으로, 메서드를 변수처럼 사용할 수 있도록 합니다.
  • Action: 반환값이 없는 메서드를 참조하는 델리게이트입니다.
  • Func: 반환값이 있는 메서드를 참조하는 델리게이트로, 마지막 매개변수로 반환 타입을 설정합니다.
  • RelayCommand: WPF에서 MVVM 패턴을 구현할 때 사용되며, Action을 통해 명령을 실행하고, Func<bool>을 통해 실행 조건을 지정합니다.

이 개념을 이해하면 WPF에서 MVVM 패턴의 명령 시스템을 보다 효율적으로 구현할 수 있습니다.

반응형

+ Recent posts