컴포넌트 간의 데이터를 주고받을 경우 Prism의 EventAggregator를 사용하면 편리하지만 WPF 만을 사용할 경우 아래 코드와 같이 구성하여 사용하였습니다.
Event Manager
EventManager.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| namespace Tool.Event { public class EventManager { public delegate void EventHandler(); event EventHandler event;
public void Subscribe(EventHandler handler) { event += handler; }
public void UnSubscribe(EventHandler handler) { event -= handler; }
public void Publish() { event?.Invoke(); } }
public class EventManager<T> { public delegate void EventHandler(T item); event EventHandler event;
public void Subscribe(EventHandler handler) { event += handler; }
public void UnSubscribe(EventHandler handler) { event -= handler; }
public void Publish(T item) { event?.Invoke(item); } } }
|
Event Notifier
EventNotifier.cs
1 2 3 4 5 6 7 8 9 10 11
| namespace Tool.Event { public class EventNotifier { public static EventManager<string> InputDataEvent = new EventManager<string>();
public static EventManager OpenEvent = new EventManager();
public static EventManager CloseEvent = new EventManager(); } }
|
사용 예
이벤트 등록
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| namespace Tool.Views { public partial class TestWindow : Window { public TestWindow() { InitializeComponent(); }
private void CloseClick(object sender, RoutedEventArgs e) { this.Close(); EventNotifier.CloseEvent.Publish(); } } }
|
이벤트 받기
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| namespace Tool.ViewModwl { public class MainWindowViewModwl { public MainWindow() { EventNotifier.CloseEvent.Subscribe(CloseEvent); }
private void CloseEvent() { Console.WriteLine("CloseEvent"); } } }
|
위의 코드는 다른 Window 에서 창을 종료 시 메인 Window 의 기능을 수행하기 위한 예제입니다.