看MVVMLight的Messager源碼彪蓬,自己實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的Messager類(lèi)。
Messager類(lèi)可以在MVVM中,實(shí)現(xiàn)View與VM冯遂、VM與VM、View與View的通信谒获。
<pre>
public class Messager
{
private static Messager _MessageInstance;
private Dictionary<string,Action> _MessageCollection=new Dictionary<string,Action> ();
private Dictionary<string, ActionClass> _MessageTCollection = new Dictionary<string, ActionClass>();
public static Messager Default
{
get
{
if (_MessageInstance == null)
{
_MessageInstance = new Messager();
}
return _MessageInstance;
}
}
public void Register(string key,Action action)
{
_MessageCollection.Add(key,action);
}
public void Register<T>(string key, Action<T> action)
{
ActionClass<T> actionClass = new ActionClass<T>();
actionClass.action = action;
_MessageTCollection.Add(key, actionClass);
}
public void Send(string key)
{
if (_MessageCollection.Keys.Contains(key))
{
_MessageCollection[key].Invoke();
}
}
public void Send<T>(string key,T para)
{
if (_MessageTCollection.Keys.Contains(key))
{
ActionClass<T> actionClass=(ActionClass<T>) _MessageTCollection[key];
actionClass.action.Invoke(para);
}
}
}
</pre>
比如蛤肌,VM中需要顯示一個(gè)窗體,為了不破壞MVVM模式批狱,我們可以把顯示窗體的方法寫(xiě)在View中裸准,并注冊(cè)到Messager
<pre>
Messager.Default.Register<string>("ChangeControlShow", ExecuteChangedContrlShow);
private void ExecuteChangedContrlShow(string msg)
{
//some code...
}
</pre>
在VM中調(diào)用
<pre>
Messager.Default.Send<string>("ChangeControlShow","test");
</pre>
Send有兩個(gè)參數(shù),第一個(gè)是方法的Key赔硫,根據(jù)這個(gè)Key炒俱,可以找到唯一的方法,
第二個(gè)參數(shù)是需要調(diào)用的方法的參數(shù)爪膊。
這樣权悟,你只要知道方法的key,在任何文件中推盛,都可以調(diào)用注冊(cè)的方法峦阁,不需要我們?cè)偃ナ褂梦辛恕?/p>