Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓƵ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
ÉîÈë½éÉÜ MVVM Light Messenger
 
×÷ÕߣºLaurent Bugnion À´Ô´£ºCSDN ·¢²¼ÓÚ 2015-11-30
  4561  次浏览      20
 

´ËϵÁнéÉÜÁË Model-View-ViewModel (MVVM) ģʽºÍ MVVM Light Toolkit¡£

Messenger ×é¼þʵ¼ÊÉÏÊÇ MVVM Light Toolkit µÄÒ»¸ö¹¦ÄÜÏ൱ǿ´óµÄÔªËØ£¬ËüÓÉÓÚ¼òµ¥Ò×ÓöøÊܵ½¿ª·¢ÈËÔ±µÄÇàíù£¬µ«Ò²ÓÉÓÚÎóÓûá´øÀ´·çÏÕ¶øÒý·¢ÁËһЩÕùÒé¡£´Ë×é¼þÐèÒªÓÃһƪµ¥¶ÀµÄÎÄÕÂÀ´½éÉÜËüµÄ¹¤×÷·½Ê½¡¢´æÔÚÄÄЩ·çÏÕÒÔ¼°ÔÚÄÄЩ³¡¾°ÏÂ×î¾ß¼ÛÖµ¡£

ÔÚ±¾ÎÄÖУ¬ÎÒ½«ÌÖÂÛ Messenger ʵʩµÄÒ»°ãÔ­Ôò£¬²¢½éÉÜΪʲô´Ëʵʩ±È´«Í³·½·¨¸üÈÝÒ×ʹÓá£ÎÒ»¹½«Ì½ÌÖÕâÖÖ·½·¨ÔÚ²»²ÉÈ¡¾ßÌå·À·¶´ëÊ©µÄÇé¿öÏ»á¶ÔÄÚ´æÔì³ÉÔõÑùµÄÓ°Ïì¡£×îºó£¬ÎÒ½«¸üÏêϸµØÌÖÂÛ MVVM Light Messenger ±¾Éí£¬ÌرðÊÇһЩÄÚÖÃÏûÏ¢¼°ÆäÓÃ;¡£

ʼþ¾ÛºÏºÍ Messenger ¼ò»¯

ÖîÈç Messenger Ö®ÀàµÄϵͳÓÐʱ³ÆΪʼþ×ÜÏß»òʼþ¾ÛºÏÆ÷¡£´ËÀà×é¼þÁ¬½Ó½ÓÊն˺ͷ¢ËͶˣ¨ÓÐʱ·Ö±ð³ÆΪ¡°·¢²¼·þÎñÆ÷¡±ºÍ¡°¶©ÔÄ·þÎñÆ÷¡±£©¡£ÔÚ MVVM Light ´´½¨ºó£¬Ðí¶àÏûϢϵͳ¶¼ÒªÇó½ÓÊն˻ò·¢ËͶËʵʩ¾ßÌåµÄ·½·¨¡£ÀýÈ磬¿ÉÄÜ´æÔÚÖ¸¶¨Á˽ÓÊÕ·½·¨µÄ IReceiver ½Ó¿Ú£¬¶øΪÁËÏòÏûϢϵͳע²á£¬¶ÔÏó¾ÍÐèҪʵʩ´Ë½Ó¿Ú¡£ÕâÖÖÏÞÖƺܷ³ÈË£¬ÒòΪËüÏÞÖÆÁËÏûϢϵͳµÄʵ¼ÊʹÓÃÕß¡£ÀýÈ磬Èç¹ûÄúʹÓõÄÊǵÚÈý·½³ÌÐò¼¯£¬ÔòÎÞ·¨ÏòÏûϢϵͳע²á´Ë¿âÖеÄʵÀý£¬ÒòΪÄúÎÞȨ·ÃÎÊ´úÂ룬²¢ÇÒÎÞ·¨Ð޸ĵÚÈý·½ÀàÀ´ÊµÊ© IReceiver¡£

MVVM Light Messenger Ö¼ÔÚͨ¹ý¼òµ¥µÄÇ°ÌáÀ´¾«¼ò´Ë³¡¾°£ºÈκζÔÏ󶼿ÉÒÔÊǽÓÊնˣ»ÈκζÔÏ󶼿ÉÒÔÊÇ·¢ËͶˣ»ÈκζÔÏ󶼿ÉÒÔÊÇÏûÏ¢¡£

´Ê»ãÒ²µÃµ½Á˼ò»¯¡£Ê¹ÓÃÏûÏ¢ÕâÀàÈÝÒ×Àí½âµÄ´ÊÓ¶ø²»ÊÇʹÓÃÄÑÒÔ¶¨ÒåµÄ´ÊÓÈ硰ʼþ¾ÛºÏ¡±£©¡£¶©ÔÄ·þÎñÆ÷±äΪ½ÓÊնˣ¬·¢²¼·þÎñÆ÷Ôò±äΪ·¢ËͶˡ£ÏûϢȡ´úÁËʼþ¡£Í¨¹ýÓïÑÔÓëʵʩÉϵļò»¯£¬Äú¿ÉÒÔ¸üÇáËɵؿªÊ¼Ê¹Óà Messenger ²¢Á˽âËüµÄ¹¤×÷·½Ê½¡£

ÀýÈ磬Ç뿼ÂÇʹÓÃÏÂÁÐÖеĴúÂë¡£ÈçÄúËù¼û£¬MVVM Light Messenger ÊÇÔÚÁ½¸ö¶ÀÁ¢¶ÔÏóÖÐʹÓá£×¢²á¶ÔÏó½«ÏûÏ¢·¢Ë͸øËùÓÐµÄ RegisteredUser ʵÀý¡£¿ÉÒÔͨ¹ý¶àÖÖ·½Ê½À´ÊµÊ©ÕâÖÖ³¡¾°£¬Messenger ¿ÉÄܲ¢²»Ò»¶¨ÊÇ×îºÃµÄ½â¾ö·½°¸¡£²»¹ý£¬ËüÒ²¿ÉÒÔ³ÉΪʵʩ´Ë¹¦ÄܵÄÀíÏ빤¾ß£¬ÌرðÊǵ±·¢ËͶ˺ͽÓÊÕ¶ËÊôÓÚÓ¦±£³Ö·ÖÀë״̬µÄÓ¦ÓóÌÐòʱ£¬¾ßÌåÈ¡¾öÓÚÄúµÄÌåϵ½á¹¹¡£Çë×¢Ò⣬ע²áʵÀý²»»á½«ÏûÏ¢Ã÷È··¢Ë͸ø RegisteredUser ʵÀý¡£Ïà·´£¬Ëü»áͨ¹ý Messenger ¹ã²¥ÏûÏ¢¡£ÈκÎʵÀý¶¼¿ÉÒÔ×¢²á´ËÀàÐ͵ÄÏûÏ¢£¬²¢ÔÚÏûÏ¢·¢ËÍʱÊÕµ½Í¨Öª¡£ÔÚ±¾Ê¾ÀýÖУ¬·¢Ë͵ÄÏûÏ¢ÊÇÒ»¸ö RegistrationInfo ʵÀý¡£È»¶ø£¬ÈκÎÀàÐ͵ÄÏûÏ¢¶¼¿ÉÒÔ·¢ËÍ£¬´Ó¼òµ¥ÊýÖµ£¨ÕûÊý¡¢²¼¶ûµÈ£©µ½×¨ÓÃÏûÏ¢¶ÔÏó¡£ÉÔºó£¬ÎÒ½«ÌÖÂÛÈçºÎʹÓÃÏûÏ¢£¬²¢»Ø¹Ë MVVM Light ÖеÄһЩÄÚÖÃÏûÏ¢ÀàÐÍ¡£

·¢ËͺͽÓÊÕÏûÏ¢

public class Registration 
{
public void SendUpdate()
{
var info = new RegistrationInfo { // ...һЩÊôÐÔ };
Messenger.Default.Send(info);
}
}

public class RegisteredUser
{
public RegisteredUser()
{
Messenger.Default.Register<RegistrationInfo>( this, HandleRegistrationInfo);
}

private void HandleRegistrationInfo(RegistrationInfo info)
{
// ¸üÐÂÒÑ×¢²áµÄÓû§ÐÅÏ¢
}
}

public class RegistrationInfo
{
// ...һЩÊôÐÔ
}

ÒÔÉϵĴúÂëչʾÁËͨ¹ý´úÀí (HandleRegistrationInfo) Íê³É×¢²áÏûÏ¢ÀàÐÍ (RegistrationInfo)¡£ÕâÊÇ Microsoft .NET Framework Öеij£¼û»úÖÆ¡£ÀýÈ磬ÔÚ C££ ÖÐ×¢²áʼþ´¦Àí³ÌÐòÒ²¿ÉÒÔͨ¹ýÏòʼþ´«µÝ´úÀíÀ´Íê³É£¬´úÀí¿ÉÒÔÊÇÃüÃû·½·¨»òÊÇÄäÃûµÄ lambda ±í´ïʽ¡£Í¬ÑùµØ£¬Äú¿ÉÒÔʹÓÃÃüÃû·½·¨»òÄäÃûµÄ lambda ±í´ïʽÏò Messenger ×¢²á½ÓÊնˣ¬ÈçÏ´úÂëËùʾ¡£

ʹÓÃÃüÃû·½·¨»ò Lambda ½øÐÐ×¢²á

public UserControl() 
{
InitializeComponent();
// ʹÓÃÃüÃû·½·¨½øÐÐ×¢²á ----
Loaded += Figure2ControlLoaded;

Messenger.Default.Register<AnyMessage>( this, HandleAnyMessage);
// ʹÓÃÄäÃû Lambda ½øÐÐ×¢²á ----
Loaded += (s, e) => { // Ö´ÐÐij²Ù×÷ };
Messenger.Default.Register<AnyMessage>( this, message => { // Ö´ÐÐij²Ù×÷ });
}

private void HandleAnyMessage(AnyMessage message)
{
// Ö´ÐÐij²Ù×÷
}

private void Figure2ControlLoaded (object sender, RoutedEventArgs e)
{
// Ö´ÐÐij²Ù×÷
}

¿çÏ̷߳ÃÎÊ

Messenger ÎÞ·¨¹Û²ìµ½ÏûÏ¢ÊÇ´ÓÄĸöÏ̷߳¢Ë͵ġ£Èç¹ûÄú¿´¹ýÎÒ֮ǰµÄÎÄÕ¡°MVVM Ó¦ÓóÌÐòÖеĶàÏß³ÌÓëµ÷¶È¡±(bit.ly/1mgZ0Cb)£¬¾Í»áÖªµÀÈç¹ûijÏß³ÌÉÏÔËÐеĶÔÏóÊÔͼ·ÃÎÊÁíÒ»Ïß³ÌÉϵĶÔÏó£¬ÔòÐèÒª²ÉȡһЩ·À·¶´ëÊ©¡£´ËÎÊÌâͨ³£ÊÇÔÚºǫ́Ïß³ÌºÍ UI Ïß³ÌÓµÓеĿؼþÖ®¼ä²úÉú¡£ÔÚ֮ǰµÄÎÄÕÂÖУ¬ÄúÁ˽âÁËÈçºÎʹÓà MVVM Light DispatcherHelper¡°µ÷¶È¡±UI Ïß³ÌÉϵIJÙ×÷£¬²¢±ÜÃâ³öÏÖ¿çÏ̷߳ÃÎÊÒì³£¡£

ͨ¹ýһЩʼþ¾ÛºÏÆ÷£¬Äú¿ÉÒÔ×Ô¶¯µ÷¶È·¢Ë͵½ UI Ï̵߳ÄÏûÏ¢¡£²»¹ý£¬MVVM Light Messenger ¾ø²»»áÕâô×ö£¬ÒòΪËüÖ¼ÔÚ¼ò»¯ Messenger API¡£Ìí¼ÓÓÃÓÚ×Ô¶¯µ÷¶È·¢Ë͵½ UI Ï̵߳ÄÏûÏ¢µÄÑ¡Ïî»áÏò×¢²á·½·¨Ìí¼Ó¸ü¶à²ÎÊý¡£´ËÍ⣬ÕâÒ²»á½µµÍµ÷¶ÈµÄÃ÷È·ÐÔ£¬²¢ÇÒ¿ÉÄܻᵼÖ¾­ÑéǷȱµÄ¿ª·¢ÈËÔ±¸ü¼ÓÄÑÒÔÁ˽âÄÚ²¿·¢ÉúÁËʲô¡£

Ïà·´£¬ÄúÓ¦¸Ã¸ù¾ÝÐèÒªÃ÷È·µ÷¶È·¢Ë͵½ UI Ï̵߳ÄÏûÏ¢¡£Îª´Ë£¬×îºÃʹÓà MVVM Light DispatcherHelper¡£Èç֮ǰµÄÎÄÕÂËùÊö£¬CheckBeginInvokeOnUI ·½·¨Ö»»áÔÚ±ØҪʱµ÷¶È²Ù×÷¡£Èç¹û Messenger ÒѾ­ÔÚ UI Ïß³ÌÉÏÔËÐУ¬ÄÇôÏûÏ¢»áÔÚ²»½øÐе÷¶ÈµÄÇé¿öÏÂÁ¢¼´·¢ËÍ£º

public void RunOnBackgroundThread() 
{
// Ö´ÐÐijºǫ́²Ù×÷
DispatcherHelper.CheckBeginInvokeOnUI( () => { Messenger.Default.Send(new ConfirmationMessage()); });
}

ÄÚ´æ´¦Àí

ÔÊÐí¶ÔÏóÔÚ»¥²»ÏàʶµÄÇé¿öϽøÐÐͨÐŵÄËùÓÐϵͳ¶¼ÒªÍê³É±£´æ¶ÔÏûÏ¢½ÓÊն˵ÄÒýÓõļè¾ÞÈÎÎñ¡£ÀýÈ磬¼ÙÉè .NET ʼþ´¦Àíϵͳ¿ÉÒÔÔÚÒý·¢Ê¼þµÄ¶ÔÏóºÍ¶©ÔÄʼþµÄ¶ÔÏóÖ®¼ä½¨Á¢Ç¿ÒýÓá£ÏÂÁÐÖеĴúÂë¿ÉÒÔÔÚ _first ºÍ _second Ö®¼ä½¨Á¢Ç¿¹ØÁª¡£Ò²¾ÍÊÇ˵£¬Èç¹ûϵͳµ÷ÓÃÇåÀí·½·¨£¬ÇÒ _second ÉèÖÃΪ¿Õ£¬ÄÇôÀ¬»ø»ØÊÕÆ÷ÎÞ·¨½«Ëü´ÓÄÚ´æÖÐɾ³ý£¬ÒòΪ _first ÈÔÒýÓÃËü¡£À¬»ø»ØÊÕÆ÷ÒÀÀµÓÚͨ¹ý¼ÆËã¶Ô¶ÔÏóµÄÒýÓÃÀ´È·¶¨ÄÜ·ñ½«Ëü´ÓÄÚ´æÖÐɾ³ý£¬µ« _second ʵÀý²»»áÔ⵽ɾ³ý£¬Òò´Ë»á³öÏÖÄÚ´æй©¡£Ëæ×Åʱ¼äµÄÍÆÒÆ£¬Õâ¿ÉÄܻᵼÖºܶàÎÊÌâ·¢Éú£»Ó¦ÓóÌÐòµÄËٶȿÉÄÜ»á´ó·ù¼õÂý£¬×îÖÕÉõÖÁ»á·¢Éú¹ÊÕÏ¡£

ʵÀýÖ®¼äµÄÇ¿ÒýÓÃ

public class Setup 
{
private First _first = new First();
private Second _second = new Second();
public void InitializeObjects()
{
_first.AddRelationTo(_second);
}

public void Cleanup()
{
_second = null;
// ¼´Ê¹ _second ʵÀýÉèÖÃΪ¿Õ£¬ËüÒ²ÈԻᱣÁôÔÚÄÚ´æÖУ¬ÒòΪÒýÓüÆÊý²»ÎªÁ㣨_first ÈÔÒýÓÃËü£©¡£
}
}

public class First
{
private object _another;
public void AddRelationTo(object another)
{
_another = another;
}
}

public class Second { }

ΪÁË»º½â´ËÎÊÌ⣬.NET ¿ª·¢ÈËÔ±Ìá³öÁËʹÓà WeakReference ¶ÔÏó¡£´ËÀàÔÊÐí¡°Èõ¡±´æ´¢¶Ô¶ÔÏóµÄÒýÓá£Èç¹û½«¶Ô¸Ã¶ÔÏóµÄÆäËûËùÓÐÒýÓö¼ÉèÖÃΪ¿Õ£¬ÔòÀ¬»ø»ØÊÕÆ÷ÈÔ¿ÉÒÔÊÕ¼¯¸Ã¶ÔÏ󣬼´Ê¹ WeakReference »¹ÔÚʹÓÃËü£¬Ò²ÊÇÈç´Ë¡£ÕâÑù¾Í·Ç³£·½±ã£ºÈç¹ûºÏÀíʹÓ㬱ã¿ÉÒÔ»º½âÄÚ´æй©ÎÊÌ⣬µ«Ëü²¢²»Ò»¶¨Äܹ»½â¾öËùÓÐÎÊÌ⡣ΪÁË˵Ã÷ÕâÒ»µã£¬ÈçÏ´úÂëչʾÁËÒ»¸ö¼òµ¥µÄͨÐÅϵͳ£¬ÆäÖÐ SimpleMessenger ¶ÔÏ󽫶ԽÓÊն˵ÄÒýÓô洢ÔÚ WeakReference ÖС£Çë×¢ÒâÎñ±ØÔÚ´¦ÀíÏûϢ֮ǰ¼ì²é IsAlive ÊôÐÔ¡£Èç¹û½ÓÊÕ¶ËÒÑɾ³ýÇÒ֮ǰ×÷ΪÀ¬»ø»ØÊÕ¹ý£¬Ôò IsAlive ÊôÐÔΪ false¡£Õâ±íÃ÷ WeakReference ²»ÔÙÓÐЧ£¬Ó¦¸ÃÔ⵽ɾ³ý¡£

ʹÓà WeakReference ʵÀý

public class SuperSimpleMessenger 
{
private readonly List<WeakReference> _receivers = new List<WeakReference>();
public void Register(IReceiver receiver)
{
_receivers.Add(new WeakReference(receiver));
}

public void Send(object message)
{
// Ëø¶¨½ÓÊÕ¶ËÒÔÃâ·¢Éú¶àÏß³ÌÎÊÌâ¡£
lock (_receivers)
{
var toRemove = new List<WeakReference>();
foreach (var reference in _receivers.ToList())
{
if (reference.IsAlive)
{
((IReceiver)reference.Target).Receive(message);
}
else
{
toRemove.Add(reference);
}
}
// ɾ³ýÎÞЧÒýÓá£ÔÚÆäËûÑ­»·ÖÐÖ´Ðд˲Ù×÷£¬ÒÔÃâÔÚÐ޸ĵ±Ç°Ñ­»··ÃÎʵļ¯ºÏʱ·¢ÉúÒì³£¡£
foreach (var dead in toRemove)
{
_receivers.Remove(dead);
}
}
}
}

MVVM Light Messenger µÄÔ­Ôò´óÖÂÏàͬ£¬µ«µ±È»Òª¸ü¼Ó¸´ÔÓ£¡ÖµµÃ×¢ÒâµÄÊÇ£¬ÓÉÓÚ Messenger ²»ÒªÇó½ÓÊÕ¶ËʵʩÈκθø¶¨½Ó¿Ú£¬Òò´ËËüÐèÒª´æ´¢¶ÔÓÃÓÚ´«ÊäÏûÏ¢µÄ·½·¨£¨»Øµ÷£©µÄÒýÓá£ÔÚ Windows Presentation Foundation (WPF) ºÍ Windows ÔËÐÐʱÖУ¬Õâ²¢²»ÊǸöÎÊÌâ¡£²»¹ý£¬ÔÚ Silverlight ºÍ Windows Phone ÖУ¬¸Ã¿ò¼Ü¸ü¼Ó°²È«£¬ÇÒ API ×èÖ¹Ìض¨²Ù×÷·¢Éú¡£ÔÚÌض¨Çé¿öÏ£¬ÕâЩÏÞÖÆÖеÄÈκÎÒ»Ï»á¶Ô Messenger ϵͳ²úÉúÓ°Ïì¡£

ÒªÀí½âÕâÒ»µã£¬ÄúÐèÒªÖªµÀ¿ÉÒÔ×¢²áÄÄЩÀàÐ͵ķ½·¨À´´¦ÀíÏûÏ¢¡£¼ò¶øÑÔÖ®£¬½ÓÊÕ·½·¨¿ÉÒÔÊǾ²Ì¬µÄ£¨Õâ¾ø²»ÊǸöÎÊÌ⣩£»Ò²¿ÉÒÔÊÇʵÀý·½·¨£¬ÔÚÕâÖÖÇé¿öÏ£¬ÄúÐèÒªÇø·Ö¹«¹²¡¢ÄÚ²¿ºÍרÓ÷½·¨¡£ÔÚÐí¶àÇé¿öÏ£¬½ÓÊÕ·½·¨ÊÇÄäÃûµÄ lambda ±í´ïʽ£¬ÓëרÓ÷½·¨Ò»Ñù¡£

Èç¹ûÊǾ²Ì¬»ò¹«¹²·½·¨£¬Ôò²»»áÓÐÄÚ´æй©µÄ·çÏÕ¡£Èç¹ûÒª´¦ÀíµÄÊÇÄÚ²¿»òרÓ÷½·¨£¨»òÄäÃû lambda£©£¬Ôò Silverlight ºÍ Windows Phone ÖпÉÄÜÓзçÏÕ¡£ºÜÒź¶£¬ÔÚÕâÖÖÇé¿öÏ£¬Messenger ÎÞ·¨Ê¹Óà WeakReference¡£Í¬ÑùµØ£¬ÕâÔÚ WPF »ò Windows ÔËÐÐʱÖв¢²»ÊǸöÎÊÌ⡣ϱí¶Ô´ËÐÅÏ¢½øÐÐÁË×ܽᡣ

δȡÏû×¢²áʱµÄÄÚ´æй©·çÏÕ

ÇëÎñ±Ø×¢Ò⣬¼´Ê¹´æÔÚÒÔÉϱí¸ñÖÐÖ¸Ã÷µÄ·çÏÕ£¬È¡Ïû×¢²áʧ°ÜÒ²²»Ò»¶¨»áÔì³ÉÄÚ´æй©¡£Ò²¾ÍÊÇ˵£¬ÎªÁËÈ·±£²»»áÒýÆðÄÚ´æй©£¬ÒªÔÚ²»ÔÙÐèÒªµÄÇé¿öÏÂÃ÷È·´Ó Messenger È¡Ïû×¢²á½ÓÊնˡ£Õâ¿ÉÒÔͨ¹ýÈ¡Ïû×¢²á·½·¨À´Íê³É¡£Çë×¢Ò⣬ȡÏû×¢²á·½·¨Óжà¸öÖØÔØ¡£Äú¿ÉÒÔ´Ó Messenger ÍêÈ«È¡Ïû×¢²á½ÓÊնˣ¬Ò²¿ÉÒÔÑ¡ÔñֻȡÏû×¢²áÒ»¸ö¸ø¶¨·½·¨£¬¶ø±£³ÖÆäËû·½·¨ÓÐЧ¡£

ʹÓà Messenger ʱÐèÒªÃæÁÙµÄÆäËû·çÏÕ

ÈçÇ°ËùÊö£¬ËäÈ» MVVM Light Messenger ÊÇÒ»¸ö¹¦Äܷdz£Ç¿´óÇÒÓÃ;¹ã·ºµÄ×é¼þ£¬µ«ÇëÎñ±Ø×¢Ò⣬ʹÓÃËüÒ²ÐèÒªÃæÁÙһЩ·çÏÕ¡£ÎÒÒѾ­Ìáµ½¹ý Silverlight ºÍ Windows Phone ÖдæÔÚµÄÄÚ´æй©DZÔÚ·çÏÕ¡£ÁíÒ»Ïî·çÏÕÓë¼¼Êõ²»Ì«Ïà¹Ø£º¹ý¶àµØʹÓà Messenger ·ÖÀë¶ÔÏó»áµ¼ÖÂÄúºÜÄÑÁ˽âÔÚÏûÏ¢·¢ËͺͽÓÊÕʱµ½µ×·¢ÉúÁËʲô¡£¾­ÑéǷȱµÄ¿ª·¢ÈËÔ±£¨ÒÔÇ°´ÓδʹÓùýʼþ×ÜÏߣ©Ò²¿ÉÄÜÄÑÒÔ×ñÑ­²Ù×÷Á÷³Ì¡£ÀýÈ磬Èç¹ûÄúÒª·ÖÎöij·½·¨µÄµ÷Ó㬲¢ÇÒ´Ë·½·¨µ÷Óà Messenger.Send ·½·¨£¬ÄÇô³ý·ÇÄúÖªµÀÒªËÑË÷ÏàÓ¦µÄ Messenger.Receive ·½·¨²¢ÔÚÆäÖзÅÖÃÒ»¸ö¶Ïµã£¬·ñÔò»á©µôµ÷ÊÔÁ÷³Ì¡£Ò²¾ÍÊÇ˵£¬Messenger ²Ù×÷ÊÇͬ²½½øÐеģ¬Èç¹ûÄúÁ˽â Messenger µÄ¹¤×÷·½Ê½£¬ÔòÈÔ¿ÉÒÔµ÷ÊÔ´ËÁ÷³Ì¡£

µ±¸ü¶à³£¹æ±à³Ì¼¼ÊõÓò»ÁË»òÈÃÎÒÒª¾¡¿ÉÄܱ£³Ö·ÖÀë״̬µÄÓ¦ÓóÌÐò²¿¼þ»¥Ïà¹ý¶àÒÀÀµÊ±£¬ÎÒÍùÍù»á½« Messenger ÓÃ×÷¡°×îºóµÄ½â¾ö°ì·¨¡±¡£µ«ÓÐʱ×îºÃʹÓÃÆäËû¹¤¾ß£¨Èç IOC ÈÝÆ÷£©ºÍ·þÎñ£¬ÒÔ¸üÃ÷È·µÄ·½Ê½»ñµÃÀàËƽá¹û¡£

Ò»¸ö»ò¶à¸ö Messenger

ÏûϢϵͳ£¨Èç MVVM Light Messenger£©µÄÓÅÊÆÖ®Ò»ÔÚÓÚÉõÖÁ¿ÉÒÔ¿ç³ÌÐò¼¯£¨ÀýÈ磬ÔÚ²å¼þ³¡¾°ÖУ©Ê¹Óá£ÕâÊÇÒ»ÖÖÓÃÓÚ¹¹½¨´óÐÍÓ¦ÓóÌÐòµÄ³£¼ûÌåϵ½á¹¹£¬ÓÈÆäÊÇÔÚ WPF ÖС£²»¹ý£¬²å¼þϵͳ¶Ô¹æÄ£½ÏСµÄÓ¦ÓóÌÐòÒ²·Ç³£ÓÐÓã¬ÀýÈçÎÞÐèÖØбàÒëÖ÷Òª²¿·Ö¼´¿ÉÇáËÉÌí¼Óй¦ÄÜ¡£Ö»Òª DLL ÔÚÓ¦ÓóÌÐòµÄ AppDomain ÖмÓÔØ£¬Ëü°üº¬µÄÀà±ã¿ÉÒÔʹÓà MVVM Light Messenger ÓëͬһӦÓóÌÐòÖеÄÆäËûÈκÎ×é¼þ½øÐÐͨÐÅ¡£´Ë¹¦Äܷdz£Ç¿´ó£¬ÓÈÆäÊǵ±Ö÷Ó¦ÓóÌÐò²»ÖªµÀ¼ÓÔصÄ×Ó×é¼þÊýÁ¿Ê±£¨Í¨³£ÔÚ»ùÓÚ²å¼þµÄÓ¦ÓóÌÐòÖз¢Éú£©¡£

Ó¦ÓóÌÐòͨ³£Ö»ÐèҪʹÓÃÒ»¸ö Messenger ʵÀýÀ´¸²¸ÇËùÓÐͨÐÅ¡£Äú¿ÉÄÜÖ»ÐèÒª´æ´¢ÔÚ Messenger.Default ÊôÐÔÖеľ²Ì¬ÊµÀý¡£²»¹ý£¬Äú¿ÉÒÔ¸ù¾ÝÐèҪн¨ Messenger ʵÀý¡£ÔÚÕâÖÖÇé¿öÏ£¬Ã¿¸ö Messenger ¶¼ÓÃ×÷µ¥¶ÀµÄÐŵÀ¡£Èç¹ûÄúÏëÈ·±£¸ø¶¨¶ÔÏó¾ø²»»áÊÕµ½²»ÊÇ·¢Ë͸øËüµÄÏûÏ¢£¬±ã»á·¢ÏÖÕâÑù×ö·Ç³£ÓÐÓá£ÀýÈ磬ÒÔÏÂÖеĴúÂëչʾÁËÁ½¸öÀà×¢²áͬһÏûÏ¢ÀàÐÍ¡£ÊÕµ½ÏûϢʱ£¬Á½¸öʵÀý¶¼ÐèÒªÖ´ÐÐһЩ¼ì²éÀ´Á˽âÏûÏ¢µÄÓÃ;¡£

ʹÓÃĬÈ쵀 Messenger ²¢¼ì²é·¢ËͶË

public class FirstViewModel 
{
public FirstViewModel()
{
Messenger.Default.Register<NotificationMessage>( this, message =>
{
if (message.Sender is MainViewModel)
{
// ´ËÏûÏ¢ÊÇÒª·¢Ë͸øÎÒ¡£
}
});
}
}

public class SecondViewModel
{
public SecondViewModel()
{
Messenger.Default.Register<NotificationMessage>( this, message =>
{
if (message.Sender is SettingsViewModel)
{
// ´ËÏûÏ¢ÊÇÒª·¢Ë͸øÎÒ
}
});
}
}

ÒÔÏÂչʾÁËרÓà Messenger ʵÀýµÄʵʩ¡£ÔÚÕâÖÖÇé¿öÏ£¬SecondViewModel ¾ø²»»áÊÕµ½ÏûÏ¢£¬ÒòΪËü¶©ÔÄÆäËû Messenger ʵÀý²¢ÕìÌýÆäËûÐŵÀ¡£

ʹÓÃרÓà Messenger

public class MainViewModel 
{
private Messenger _privateMessenger;
public MainViewModel()
{
_privateMessenger = new Messenger();
SimpleIoc.Default.Register(() => _privateMessenger, "PrivateMessenger");
}

public void Update()
{
_privateMessenger.Send(new NotificationMessage("DoSomething"));
}
}

public class FirstViewModel
{
public FirstViewModel()
{
var messenger = SimpleIoc.Default.GetInstance<Messenger>("PrivateMessenger");
messenger.Register<NotificationMessage>( this, message =>
{
// ´ËÏûÏ¢ÊÇÒª·¢Ë͸øÎÒ¡£
});
}
}

ÁíÒ»ÖÖ±ÜÃâÏòÌض¨½ÓÊն˷¢Ë͸ø¶¨ÏûÏ¢µÄ·½·¨ÊÇʹÓÃÁîÅÆ£¬Èçͼ 8 Ëùʾ¡£ÕâÊÇÒ»ÖÖÓÉ·¢ËͶ˺ͽÓÊն˴ï³ÉµÄЭ¶¨¡£ÁîÅÆͨ³£ÊÇÒ»¸öΨһ±êʶ·û£¨Èç GUID£©£¬µ«Ò²¿ÉÒÔÊÇÈÎÒâ¶ÔÏó¡£Èç¹û·¢ËͶ˺ͽÓÊÕ¶ËʹÓÃÏàͬµÄÁîÅÆ£¬ÔòÕâÁ½¸ö¶ÔÏóÖ®¼ä»á´ò¿ªÒ»ÌõרÓÃÐŵÀ¡£ÔÚÕâÖÖÇé¿öÏ£¬Ã»ÓÐʹÓÃÁîÅÆµÄ SecondViewModel ¾ø²»»áÊÕµ½ÏûÏ¢ÕýÔÚ·¢Ë͵Ä֪ͨ¡£Ö÷ÒªÓÅÊÆÔÚÓÚ½ÓÊն˲»ÐèÒª±àдÓÃÓÚÈ·±£ÏûϢȷʵÊÇ·¢Ë͸øËüµÄÂß¼­¡£Ïà·´£¬Messenger »á¸ù¾ÝÁîÅÆɸѡ³öÏûÏ¢¡£

ʹÓÃÁîÅƵIJ»Í¬ÐŵÀ

public class MainViewModel 
{
public static readonly Guid Token = Guid.NewGuid();
public void Update()
{
Messenger.Default.Send(new NotificationMessage("DoSomething"), Token);
}
}

public class FirstViewModel
{
public FirstViewModel()
{
Messenger.Default.Register<NotificationMessage>( this, MainViewModel.Token, message =>
{
// ´ËÏûÏ¢ÊÇÒª·¢Ë͸øÎÒ¡£
});
}
}

ʹÓÃÏûÏ¢

ÁîÅÆÊÇÓÃÓÚɸѡÏûÏ¢µÄÀíÏë·½·¨£¬µ«Õâ²¢²»»á¸Ä±äÏûϢΪÁË´ïµ½ÈÃÈËÀí½âµÄÄ¿µÄ¶øӦЯ´øһЩÉÏÏÂÎĵÄÊÂʵ¡£ÀýÈ磬Äú¿ÉÒÔʹÓðüº¬²¼¶ûÄÚÈݵķ¢ËͺͽÓÊÕ·½·¨£¬Èçͼ 9 Ëùʾ¡£²»¹ý£¬Èç¹ûÓжà¸ö½ÓÊն˷¢ËͲ¼¶ûÏûÏ¢£¬ÄÇô½ÓÊն˸ÃÈçºÎÖªµÀÏûÏ¢µÄ½ÓÊÕ¶ËÒÔ¼°¸ÃÈçºÎ´¦Àí£¿Õâ¾ÍÊÇ×îºÃʹÓÃרÓõÄÏûÏ¢ÀàÐÍÒÔ±ãÃ÷È·ÉÏÏÂÎĵÄÔ­ÒòËùÔÚ¡£

ʹÓÃÏûÏ¢ÀàÐÍÀ´¶¨ÒåÉÏÏÂÎÄ

public class Sender 
{
public void SendBoolean()
{
Messenger.Default.Send(true);
}

public void SendNotification()
{
Messenger.Default.Send( new NotificationMessage<bool>(true, Notifications.PlayPause));
}
}

public class Receiver
{
public Receiver()
{
Messenger.Default.Register<bool>( this, b => { // ²»È·¶¨ÈçºÎ´¦Àí´Ë²¼¶û¡£});
Messenger.Default.Register<NotificationMessage<bool>>( this, message =>
{
if (message.Notification == Notifications.PlayPause)
{
// ¶ÔÏûÏ¢Ö´ÐÐij²Ù×÷¡£
Content.Debug.WriteLine(message.Notification + ":"+ message.Content);
}
});
}
}

ÒÔÉÏ´úÂ뻹չʾÁËÔÚʹÓõÄÌض¨ÏûÏ¢ÀàÐÍ¡£NotificationMessage<T> ÊÇ×î³£ÓÃµÄ MVVM Light Toolkit ÄÚÖÃÏûÏ¢ÀàÐÍÖ®Ò»£¬ËüÔÊÐí½«ÈκÎÄÚÈÝ£¨ÔÚ±¾Ê¾ÀýÖÐΪ²¼¶û£©Óë֪ͨ×Ö·û´®Ò»Æð·¢ËÍ¡£Í¨³££¬Í¨ÖªÊÇÔÚÃûΪ¡°Í¨Öª¡±µÄ¾²Ì¬ÀàÖж¨ÒåµÄΨһ×Ö·û´®¡£ÕâÑù±ã¿ÉÒÔ½«ËµÃ÷ÓëÏûÏ¢Ò»Æð·¢ËÍ¡£

µ±È»£¬Ò²¿ÉÒÔ´Ó NotificationMessage<T> ÅÉÉú¡¢Ê¹ÓÃÆäËûÄÚÖÃÏûÏ¢ÀàÐÍ»òʵʩÄú×Ô¼ºµÄÏûÏ¢ÀàÐÍ¡£MVVM Light Toolkit °üº¬¿É³öÓÚ´ËÄ¿µÄ½øÐÐÅÉÉúµÄ MessageBase À࣬µ«¾ø²»Ç¿ÖÆÒªÇó½«ËüÓÃÓÚ´úÂë¡£

ÁíÒ»¸öÄÚÖÃÏûÏ¢ÀàÐÍÊÇ PropertyChanged-Message<T>¡£Õâ¶ÔÓÚͨ³£ÓÃ×÷°ó¶¨²Ù×÷ÖÐÉæ¼°µÄ¶ÔÏóµÄ»ùÀàµÄ Observable-Object ºÍ ViewModelBase ÀàÌرðÓÐÓá£ÕâЩÀàÊÇ INotifyPropertyChanged ½Ó¿ÚµÄʵʩ£¬Õâ¶ÔÓÚʹÓÃÊý¾Ý°ó¶¨µÄ MVVM Ó¦ÓóÌÐòÖÁ¹ØÖØÒª¡£ÀýÈ磬ÔÚͼ 10 µÄ´úÂëÖУ¬BankAccountViewModel ¶¨ÒåÁËÒ»¸öÃûΪ¡°Óà¶î¡±µÄ¿É¹Û²âÊôÐÔ¡£µ±´ËÊôÐÔ·¢Éú±ä»¯Ê±£¬RaisePropertyChanged ·½·¨»á²ÉÓò¼¶û²ÎÊýÈà ViewModelBase Àà¡°¹ã²¥¡±°üº¬´ËÊôÐÔÏà¹ØÐÅÏ¢£¨ÈçÃû³Æ¡¢¾ÉÖµºÍÐÂÖµ£©µÄ PropertyChangedMessage¡£ÆäËû¶ÔÏó¿ÉÒÔ¶©ÔÄ´ËÏûÏ¢ÀàÐÍ£¬²¢ÏàÓ¦µØ×ö³öÏìÓ¦¡£

·¢ËÍ PropertyChangedMessage

public class BankViewModel :ViewModelBase 
{
public const string BalancePropertyName = "Balance";
private double _balance; public double Balance
{
get { return _balance; }
set
{
if (Math.Abs(_balance - value) < 0.001)
{
return;
}
var oldValue = _balance;
_balance = value;
RaisePropertyChanged(BalancePropertyName, oldValue, value, true);
}
}
}

public class Receiver
{
public Receiver()
{
Messenger.Default.Register<PropertyChangedMessage<double>>( this, message =>
{
if (message.PropertyName == BankViewModel.BalancePropertyName)
{
Debug.WriteLine( message.OldValue + " --> " + message.NewValue);
}
});
}
}

MVVM Light ÖеÄÆäËûÄÚÖÃÏûÏ¢ÔÚ¸÷ÖÖ³¡¾°Ï¶¼·Ç³£ÊµÓᣴËÍ⣬ÓÃÓÚ¹¹½¨Äú×Ô¼ºµÄ×Ô¶¨ÒåÏûÏ¢µÄ»ù´¡½á¹¹Ò²¿ÉÓᣴӱ¾ÖÊÉÏ˵£¬Ö÷Ҫ˼Ïë¾ÍÊÇͨ¹ýÌṩ³ä×ãµÄÉÏÏÂÎÄÈýÓÊÕ¶ËÖªµÀ¸ÃÈçºÎ´¦ÀíÏûÏ¢ÄÚÈÝ£¬´Ó¶ø¼ò»¯½ÓÊն˵Ť×÷¡£

×ܽá

ÔÚ²»Ê¹ÓÃÍêÈ«·ÖÀëµÄÏûÏ¢´«µÝ½â¾ö·½°¸¾ÍÄÑÒÔʵʩµÄÐí¶à³¡¾°ÖУ¬Ê¹Óà Messenger ÒÑ֤ʵ·Ç³£ÓÐÓá£È»¶ø£¬ÓÉÓÚ´ËΪ¸ß¼¶¹¤¾ß£¬ÄúÓ¦¸Ã½÷É÷ʹÓô˹¤¾ß£¬ÒÔÃâÉú³ÉºóÆÚÄÑÒÔµ÷ÊÔºÍά»¤µÄÔì³É»ìÏýµÄ´úÂë¡£

±¾ÎĽéÉÜÁË MVVM Light Toolkit ×é¼þ¡£ÁîÈËÐ˷ܵÄÊÇ£¬.NET ¿ª·¢ÈËÔ±Äܹ»ÔÚ¶à¸ö»ùÓÚ XAML µÄƽ̨ÉÏʹÓÃÏàͬµÄ¹¤¾ßºÍ¼¼Êõ¡£Ê¹Óà MVVM Light£¬Äú¿ÉÒÔÔÚ WPF¡¢Windows ÔËÐÐʱ¡¢Windows Phone¡¢Silverlight£¨ÉõÖÁÊÇÊÊÓÃÓÚ Android ºÍ iOS µÄ Xamarin ƽ̨£©Ö®¼ä¹²Ïí´úÂë¡£ÎÒÏ£Íû±¾ÏµÁеÄÎÄÕÂÓÐÖúÓÚÄúÁ˽â MVVM Light ÈçºÎÄܹ»°ïÖúÄúÓÐЧ¿ª·¢Ó¦ÓóÌÐò£¬Í¬Ê±ÇáËÉÉè¼Æ¡¢²âÊÔºÍά»¤ÕâЩӦÓóÌÐò¡£

   
4561 ´Îä¯ÀÀ       20
Ïà¹ØÎÄÕÂ

ΪʲôҪ×ö³ÖÐø²¿Êð£¿
ÆÊÎö¡°³ÖÐø½»¸¶¡±£ºÎå¸öºËÐÄʵ¼ù
¼¯³ÉÓë¹¹½¨Ö¸ÄÏ
³ÖÐø¼¯³É¹¤¾ßµÄÑ¡Ôñ-×°ÔØ
 
Ïà¹ØÎĵµ

³ÖÐø¼¯³É½éÉÜ
ʹÓÃHudson³ÖÐø¼¯³É
³ÖÐø¼¯³ÉÖ®-ÒÀÀµ¹ÜÀí
IPD¼¯³É²úÆ·¿ª·¢¹ÜÀí
Ïà¹Ø¿Î³Ì

ÅäÖùÜÀí¡¢ÈÕ¹¹½¨Óë³ÖÐø¼¯³É
Èí¼þ¼Ü¹¹Éè¼Æ·½·¨¡¢°¸ÀýÓëʵ¼ù
µ¥Ôª²âÊÔ¡¢Öع¹¼°³ÖÐø¼¯³É
»ùÓÚAndroidµÄµ¥Ôª¡¢ÐÔÄܲâÊÔ
×îл¼Æ»®
Èí¼þ¼Ü¹¹Éè¼Æ·½·¨¡¢°¸ÀýÓëʵ¼ù 8-23[ÌØ»Ý]
LinuxÄں˱à³Ì¼°É豸Çý¶¯ 8-15[±±¾©]
Python¡¢Êý¾Ý·ÖÎöÓë»úÆ÷ѧϰ 8-23[ÌØ»Ý]
ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ 8-22[ÏßÉÏ]
QTÓ¦Óÿª·¢ 9-5[±±¾©]

Öع¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
Visitor Parttern
ÓÉ±í¼°À￴ģʽ
Éè¼ÆģʽËæ±ÊϵÁÐ
ÉîÈëdz³öÉè¼Æģʽ-½éÉÜ
.NETÖеÄÉè¼Æģʽ
Ïà¹ØÅàѵ¿Î³Ì

J2EEÉè¼ÆģʽºÍÐÔÄܵ÷ÓÅ
Ó¦ÓÃģʽÉè¼ÆJavaÆóÒµ¼¶Ó¦ÓÃ
Éè¼ÆģʽԭÀíÓëÓ¦ÓÃ
J2EEÉè¼ÆģʽָÄÏ
µ¥Ôª²âÊÔ+Öع¹+Éè¼Æģʽ
Éè¼Æģʽ¼°ÆäCSharpʵÏÖ

ijµçÁ¦¹«Ë¾ Éè¼ÆģʽԭÀí
À¶ÍØÆË Éè¼ÆģʽԭÀí¼°Ó¦ÓÃ
ÎÀÐǵ¼º½ UML & OOAD
ÌÀɭ·͸Ñз¢ÖÐÐÄ UML& OOAD
Öдïµçͨ Éè¼ÆģʽԭÀí
Î÷ÃÅ×Ó Ç¶ÈëʽÉè¼Æģʽ
 
 
 
¡¡