silverlight 學習筆記 (六): MVVM Light Toolkits 之 Messager

在MVVM模式中,我們可以看到View和ViewModel相對獨立出來,這就引發了View與ViewModel及ViewModel見的通信,以本人看來,目前View和ViewModel見通過數據的綁定實現簡單通信,一個View能夠找到它所需要的ViewModel,綁定可以實現單向和雙向的數據通信,而ViewModel間的通信又如何來實現呢?

簡單來說如果有個View叫va,對應的存在一個viewmodel叫vma,還有一個view叫vb,對應的viewmodel叫vmb,如果我們在va中一個屬性的變化,我們想讓vb中也能有所變化,就好比va將變化通知vb,希望vb對變化進行處理。這時我們以前的做法可能是由va向vb傳遞一個參數,並觸發或調用vb中一個公開的方法。那麼在MVVM中由於View間相對對立更多的業務邏輯有Viewmodel來完成,這就意味着View間通信實際有VM來完成,但是一個vm有可能有多個view應用,又如何讓Va的變化只反映到VB中呢?所以我認爲這就是我要選擇MVVM light tookkit 中的Messager了。

Messager能爲我們做什麼?

在剛開始學Messager時總以爲他是一個消息框而已,類似Messagebox,但學習以後才發現錯了。簡單說Messager是爲我們提供了消息的發生和接收,消息發送可以指定消息對象也可採用廣播即只要註冊同意接收我的消息的實例都會收到廣播信息。另外在信息接收方可以註冊需要接收的信息並指定收到信息後需要處理的方法。說到這裏大致瞭解了Messager的核心意圖了。

如何實現?

在E站看了一個實例,簡單說下實現過程

示例:首先在ViewModelLocator中添加兩個靜態ViewModel屬性,保障每個ViewModel只有一個實例。

1、在mainpage中添加一個屬性,將該屬性變化將會廣播到發生信息

 public class MainViewModel : ViewModelBase
    {
        /// <summary>
        /// Initializes a new instance of the MainViewModel class.
        /// </summary>
        public MainViewModel()
        {
            Messenger.Default.Register<PropertyChangedMessage<string>>(this, (s) => MessageBox.Show(s.NewValue));//自身也可以接收消息
        }

        private string pA = "PA";
        public string PropertyA
        {
            get { return pA; }
            set
            {
                string oldValue = pA;
                pA = value;
                RaisePropertyChanged("PropertyA", oldValue, value, true);//這裏開始廣播消息,這是一個屬性變化引起的廣播,更復雜的可以用Send方法

            }
        }
    }

2、在第二個ViewModel中接收消息

public class TestViewModel : ViewModelBase
    {
        /// <summary>
        /// Initializes a new instance of the TestViewModel class.
        /// </summary>
        public TestViewModel()
        {
            Messenger.Default.Register<PropertyChangedMessage<string>>(ViewModel.ViewModelLocator.MainStatic, (s) =>TestString=s.NewValue);//這裏註冊接收消息,指定消息處理方法,主要要在構造函數中完成

        }

        private string ts = "TS";
        public string TestString
        {
            get { return ts; }
            set
            {
                ts = value;
                RaisePropertyChanged("TestString");
            }
        }
    }


問題思考
1、Messager確實實現了我們View及ViewModel的通信,但發現通信中的ViewModel一定是實現實例化的,這樣才能及時接收到信息並處理,所以纔會在ViewModelLocator中定義若干個ViewModel的靜態實例對象,如果是小應用倒也沒什麼,但如果一個大一些的項目如何管理這些對象一定是個問題,難道要用傳說中的Prism實現依賴注入?

2、上面也提到View間的通信其實是由ViewModel來完成,這就帶來了ViewModel的設計的複雜程度,不但要做好自身對有可能的多個View的抽象處理,還要負責對相關聯的ViewModel的通信處理。

哎,越學越覺得自己無知!高手們歡迎來我這裏指點指點啊!!!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章