728x90
728x170

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" 메세지 박스만 나타난다.




 

 

728x90
그리드형
Posted by kjun
,