2Bbear's knowledge workshop

참고 : https://documentation.devexpress.com/WPF/17474/MVVM-Framework/Messenger

 

Messenger | WPF General | WPF Controls | DevExpress Help

The Messenger class implements the IMessenger interface and allows you to implement the capability of exchanging messages between modules. Examine how to use Messenger with a simple sample. Imagine that you have a database that can be modified from multipl

documentation.devexpress.com

형태

A Region(발신자) => B Region(수신자) 로 메세지를 전송하여 B가 행동하게 하는 방법입니다

 

 

 

1. 메세지 형태를 정의합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/// <summary>
    /// TopReport Region에 상호작용 하는 메세지를 보내는 형식
    /// </summary>
    public class TopReportRegionMessage
    {
        /// <summary>
        /// 메세지 종류
        /// </summary>
        public enum Messagetype { SelectItem, DeleteItem, ModifyItem , AddItem, ChangeTree }
        public Messagetype messagetype;
        public object RecordID { get; private set; }
        public TopReportRegionMessage(object recordID, Messagetype _messageType)
        {
            RecordID = recordID;
            messagetype = _messageType;
        }
    }
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4f; text-decoration:none">Colored by Color Scripter
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none; color:white">cs

2. 메세지를 수신할 B Region 에 수신 함수를 만들어 줍니다

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
 
        public void OnMessage(TopReportRegionMessage message)
        {
            switch (message.messagetype)
            {
                case TopReportRegionMessage.Messagetype.AddItem:
                    {
                       
                    }
                    break;
                case TopReportRegionMessage.Messagetype.SelectItem:
                    {
                       
                    }
                    break;
                case TopReportRegionMessage.Messagetype.DeleteItem:
                    {
                      
                    }
                    break;
                case TopReportRegionMessage.Messagetype.ModifyItem:
                    {
                       
                    }
                    break;
                case TopReportRegionMessage.Messagetype.ChangeTree:
                    {
                        //MessageBox.Show("CLM_TopReport ChangeTree 그러니까 리포트 내용 바꾸세요 param :"+ (string)(message.RecordID));
                    }
                    break;
            }
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4f; text-decoration:none">Colored by Color Scripter
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none; color:white">cs

3. 만든 OnMessage 함수를 이제 Messenger.Default에 등록해봅시다.

1
2
3
4
        private void InitMessage()
        {
            Messenger.Default.Register<TopReportRegionMessage>(this, OnMessage); //Message Manager에 현재 클래스가 TopReportRegionMessage를 수신 할 수 있다! 라고 등록하는 코드
        }
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4f; text-decoration:none">Colored by Color Scripter
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none; color:white">cs

 

4. 메세지를 전송할 코드를 만들어줍시다. Region A에 작성

1
Messenger.Default.Send(new TopReportRegionMessage("dddd",TopReportRegionMessage.Messagetype.ChangeTree));
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none; color:white">cs

Messenger는 DevExpress에서 기본적으로 지원해주는 클래스입니다.

using DevExpress.Mvvm; 을 선언해주시면 사용 하실 수 있습니다.

 

 

- 설명

실제로 메세지를 RegionA가 B로 전송하는 것은 아닙니다. 중간에 Messenger라는 클래스가 존재하고 있어 받은 메세지를 올바른 목적지로 전송하는 형태를 취하고 있죠

즉 RegionA는 Messenger라는 클래스에 메세지를 보내고 

Messenger는 해당 메세지 형태에 바인딩된 함수를 실행시키고 메세지의 파라미터를 함수로 넘겨줍니다.

 

이 과정 전에 수신 region B는 미리 Messenger에 특정 메세지 형태에 자신의 함수를 바인딩해야 할 필요가 있습니다.