KeiStory

WPF/Prism EventAggregator 구독, 구독취소

 

EventAggregator 는 이벤트들을 구독하거나 구독기능을 제공하며

컴포넌트 간의 이벤트 처리를 직접적인 참조 없이 가능하게 해줍니다.

 

MainWindow.xaml

<Window x:Class="WpfAppPrism.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <StackPanel VerticalAlignment="Center">
        <Button Name="testButton" Content="Click!" Height="100" Width="200" HorizontalAlignment="Center" Click="testButton_Click"/>
        <Label Content=""/>
        <Button Name="unsubscribeButton" Content="Unsubscribe" Height="100" Width="200" HorizontalAlignment="Center" Click="unsubscribeButton_Click"/>
    </StackPanel>
</Window>

 

 

MainWindow.xaml.cs

using Microsoft.Practices.Composite.Events;
using Microsoft.Practices.Composite.Presentation.Events;
 
using System.Windows;
 
namespace WpfAppPrism
{
    /// <summary>
    /// string 을 인자를 가지는 이벤트 입니다.
    /// CompositePresentationEvent 는 이벤트 게시 및 구독을 관리하는 클래스입니다.
    /// </summary>
    public class SampleStringEvent : CompositePresentationEvent<string> { }
 
    public partial class MainWindow : Window
    {
        /// <summary>
        /// EventAggregator 입니다.
        /// </summary>
        EventAggregator aggregator = new EventAggregator();
 
        /// <summary>
        /// 구독 토큰입니다.
        /// </summary>
        private SubscriptionToken subscriptionToken;
 
        public MainWindow()
        {
            InitializeComponent();
 
            // 이벤트를 구독합니다.
            this.aggregator.GetEvent<SampleStringEvent>().Subscribe(StringAction1);
 
            //이벤트를 구독하고 구독취소를 위해 SubscriptionToken 을 받습니다.
            this.subscriptionToken = this.aggregator.GetEvent<SampleStringEvent>().Subscribe(StringAction2);
        }
 
        /// <summary>
        /// 이벤트 1 입니다.
        /// </summary>
        /// <param name="s"></param>
        private void StringAction1(string s)
        {
            MessageBox.Show($"{s}.StringAction1");
        }
 
        /// <summary>
        /// 이벤트 2 입니다.
        /// </summary>
        /// <param name="s"></param>
        private void StringAction2(string s)
        {
            MessageBox.Show($"{s}.StringAction2");
        }
 
        /// <summary>
        /// test 버튼 클릭 이벤트입니다.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void testButton_Click(object sender, RoutedEventArgs e)
        {
            // Subscribe 된 이벤트를 실행합니다.
            this.aggregator.GetEvent<SampleStringEvent>().Publish("testButton");
        }
 
        /// <summary>
        /// Unsubscribe 버튼 클릭 이벤트입니다.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void unsubscribeButton_Click(object sender, RoutedEventArgs e)
        {
            // 이벤트 하나를 Unsubscribe 합니다.
            this.aggregator.GetEvent<SampleStringEvent>().Unsubscribe(this.subscriptionToken);
        }
    }
}

 

Click! 버튼을 클릭하면 "testButton.StringAction2" 메세지 박스가 나온후 "testButton.StringAction1" 메세지 박스가 나타납니다.  구독한 순서 역순으로 이벤트는 발생됩니다.

 여기서 Unsubscribe 버튼을 클릭하면 "testButton.StringAction1" 메세지 박스만 나타나게됩니다.

 

 

 

 

반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band