[Prism] 014. Prism의 커맨드 및 이벤트 가져오기, DelegateCommand 및 EventAggregator 사용법

작성자: Your Name | 날짜: YYYY-MM-DD

목차

  1. 1. 서론
  2. 2. DelegateCommand
  3. 3. EventAggregator
  4. 4. 예제
  5. 5. 결론

1. 서론

WPF(Windows Presentation Foundation) 애플리케이션을 개발하기 위한 Prism 프레임워크는 모듈화, MVVM 패턴 지원 및 의존성 주입과 같은 많은 강력한 기능을 제공합니다.
이 글에서는 Prism에서 커맨드와 이벤트를 어떻게 처리하는지, 특히 DelegateCommandEventAggregator의 사용 방법에 대해 자세히 설명하겠습니다.
커맨드는 사용자 인터페이스와 뷰모델 간의 상호작용을 정의하며, 이벤트는 애플리케이션의 다른 부분 간의 통신을 가능하게 합니다. 이러한 개념은 WPF 애플리케이션의 유지보수성을 높이고 코드의 재사용성을 촉진하는 데 중요한 역할을 합니다.

2. DelegateCommand

DelegateCommand는 Prism에서 제공하는 커맨드 구현체로, 마크업 및 코드 비하인드 없이 명령을 쉽게 정의하고 실행할 수 있게 해줍니다.
이 커맨드는 일반적으로 버튼 클릭 등 UI 요소의 동작에 사용되며, 특정 조건이 충족될 때만 해당 커맨드가 실행될 수 있도록 설정할 수 있습니다. 이를 통해 MVVM 패턴을 유지하면서도 사용자 인터페이스의 동작을 세밀하게 제어할 수 있습니다.

2.1. DelegateCommand의 사용 예

DelegateCommand를 사용하기 위해서는 먼저 Prism 라이브러리를 설치해야 합니다.
NuGet 패키지 관리자를 통해 Prism.Core 패키지를 설치할 수 있습니다.
설치 후, DelegateCommand를 사용해 커맨드를 정의하는 방법을 살펴보겠습니다.

예제 코드


using Prism.Commands;
using Prism.Mvvm;

public class MyViewModel : BindableBase
{
    private string _message;
    public string Message
    {
        get => _message;
        set => SetProperty(ref _message, value);
    }

    public DelegateCommand ExecuteCommand { get; set; }

    public MyViewModel()
    {
        ExecuteCommand = new DelegateCommand(OnExecute, CanExecute)
            .ObservesProperty(() => Message);
    }

    private void OnExecute()
    {
        Message = "커맨드가 실행되었습니다!";
    }

    private bool CanExecute()
    {
        return !string.IsNullOrEmpty(Message);
    }
}
            

위의 코드에서, MyViewModel 클래스는 DelegateCommand를 사용하여 커맨드를 정의합니다.
OnExecute 메서드는 실제로 커맨드가 호출될 때 실행되며, CanExecute 메서드는 커맨드가 실행 가능한지 여부를 결정합니다.
이 구현은 해당 뷰모델의 Message 속성이 비어있지 않을 때만 커맨드를 활성화합니다.

3. EventAggregator

EventAggregator는 Prism에서 제공하는 이벤트 기반 커뮤니케이션 패턴을 구현할 수 있는 클래스로, 모듈 간의 느슨한 결합을 유지하면서 이벤트를 전달할 수 있습니다.
이는 여러 모듈이 서로 직접적으로 의존하지 않고도 서로 통신할 수 있게 해주며, 애플리케이션의 유연성과 확장성을 높입니다.

3.1. EventAggregator의 사용 예

EventAggregator를 사용하여 메시지를 게시하고 구독하는 방법을 살펴보겠습니다.

예제 코드


using Prism.Events;

public class MyEvent : PubSubEvent
{
}

public class Publisher
{
    private readonly IEventAggregator _eventAggregator;

    public Publisher(IEventAggregator eventAggregator)
    {
        _eventAggregator = eventAggregator;
    }

    public void PublishMessage(string message)
    {
        _eventAggregator.GetEvent().Publish(message);
    }
}

public class Subscriber
{
    private readonly IEventAggregator _eventAggregator;

    public Subscriber(IEventAggregator eventAggregator)
    {
        _eventAggregator = eventAggregator;
        _eventAggregator.GetEvent().Subscribe(OnMessageReceived);
    }

    private void OnMessageReceived(string message)
    {
        Console.WriteLine($"메시지를 받았습니다: {message}");
    }
}
            

위의 코드에서, MyEvent라는 커스텀 이벤트를 정의하였습니다. Publisher 클래스는 이벤트를 게시하며, Subscriber 클래스는 해당 이벤트를 구독하여 메시지를 수신합니다.
이를 통해 모듈 간의 의존성을 최소화하면서도 효과적으로 메시지를 전달할 수 있습니다.

4. 예제

이제 실질적인 예제를 통해 DelegateCommand와 EventAggregator를 함께 사용하는 방법을 보여드리겠습니다.
이 예제에서는 사용자가 버튼을 클릭하여 메시지를 입력할 수 있고, 다른 모듈에서 그 메시지를 받아 출력하는 간단한 애플리케이션을 구현해보겠습니다.

4.1. ViewModel 클래스


public class MainViewModel : BindableBase
{
    private readonly IEventAggregator _eventAggregator;

    public string InputMessage { get; set; }

    public DelegateCommand SendCommand { get; set; }

    public MainViewModel(IEventAggregator eventAggregator)
    {
        _eventAggregator = eventAggregator;
        SendCommand = new DelegateCommand(OnSendMessage);
    }

    private void OnSendMessage()
    {
        _eventAggregator.GetEvent().Publish(InputMessage);
        InputMessage = string.Empty;  // 메시지 전송 후 입력 필드를 초기화
    }
}
            

4.2. Publisher 및 Subscriber 클래스


public class PublisherModule
{
    private readonly IEventAggregator _eventAggregator;

    public PublisherModule(IEventAggregator eventAggregator)
    {
        _eventAggregator = eventAggregator;
    }

    public void Start()
    {
        var subscriber = new Subscriber(_eventAggregator);
    }
}

public class SubscriberModule
{
    private readonly IEventAggregator _eventAggregator;

    public SubscriberModule(IEventAggregator eventAggregator)
    {
        _eventAggregator = eventAggregator;
        _eventAggregator.GetEvent().Subscribe(OnMessageReceived);
    }

    private void OnMessageReceived(string message)
    {
        Console.WriteLine($"수신한 메시지: {message}");
    }
}
            

위의 코드에서는 MainViewModel이 사용자의 입력 메시지를 EventAggregator를 통해 발행하는 방법을 보여줍니다.
사용자가 버튼을 클릭하여 메시지를 전송하면, PublisherModuleSubscriberModule 간의 통신이 발생하여 메시지를 로그에 출력합니다.

5. 결론

Prism의 DelegateCommandEventAggregator는 WPF 애플리케이션에서 MVVM 패턴을 효과적으로 구현하는 데 매우 유용한 도구입니다.
DelegateCommand를 통해 UI와 뷰모델 간의 상호작용을 쉽고 효율적으로 관리할 수 있으며, EventAggregator를 사용하면 모듈 간의 유연한 통신이 가능합니다.
이러한 도구들은 애플리케이션의 유지보수성을 높이고, 확장성을 향상시키는 데 큰 도움이 됩니다. 여러분의 WPF 애플리케이션에 Prism을 적용하여 보다 나은 아키텍처를 구축해 보시기 바랍니다.