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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
ʹÓà Model-View-ViewModel µÄÎÊÌâºÍ½â¾ö·½°¸
 
À´Ô´£º²©¿ÍÔ° ·¢²¼ÓÚ£º 2017-6-21
  2979  次浏览      27
 

Windows Presentation Foundation (WPF) ºÍ Silverlight ÌṩÁ˷ḻµÄ API ÓÃÀ´¹¹½¨ÏÖ´úÓ¦ÓóÌÐò£¬µ«ÊÇÁ˽ⲢºÍгһÖµØÓ¦ÓÃËùÓÐ WPF ÌØÐÔÀ´¹¹½¨Éè¼Æ¾«Á¼¡¢Ò×ÓÚά»¤µÄÓ¦ÓóÌÐò¿ÉÄܷdz£À§ÄÑ¡£´ÓºÎ´¦ÈëÊÖ£¿Ê²Ã´ÑùµÄ·½·¨²ÅËãÊÇÕýÈ·µÄÓ¦ÓóÌÐòÉè¼Æ·½·¨£¿

Model-View-ViewModel (MVVM) Éè¼ÆÄ£Ê½ÃèÊöÁ˹¹½¨ WPF »ò Silverlight Ó¦ÓóÌÐòµÄ³£Ó÷½·¨¡£Ëü»¹ÊÇÒ»¿î¹¹½¨Ó¦ÓóÌÐòµÄÇ¿´ó¹¤¾ß£¬ÒÔ¼°Ò»ÖÖÓ뿪·¢ÈËÔ±ÌÖÂÛÓ¦ÓóÌÐòÉè¼ÆµÄͨÓÃÓïÑÔ¡£ËäÈ» MVVM ȷʵºÜÓÐÓ㬵«Ëü·¢Õ¹Ê±¼ä²»³¤£¬Óû§ÉÐδÐγÉÕýÈ·µÄÈÏʶ¡£

MVVM Éè¼ÆÄ£Ê½Ê²Ã´Ê±ºòÊÇÊÊÓõģ¬Ê²Ã´Ê±ºòÓÖÊDz»±ØÒªµÄ£¿Ó¦¸ÃÈçºÎÉè¼ÆÓ¦ÓóÌÐòµÄ½á¹¹£¿ViewModel ²ãÓжàÉÙ´úÂëÒª±àдºÍά»¤£¬ÓÐÊ²Ã´Ìæ´ú·½Ê½Äܹ»¼õÉÙ ViewModel ²ãµÄ´úÂëÁ¿£¿ÈçºÎÍ×ÉÆ´¦Àí Model ÖеÄÏà¹ØÊôÐÔ£¿Ó¦¸ÃÈçºÎÔÚ View ÖÐÏÔʾ Model Öеļ¯ºÏ£¿Ó¦¸ÃÔÚÄÄÀïʵÀý»¯ ViewModel ¶ÔÏ󣬲¢½«Æä¹Ò½Óµ½ Model ¶ÔÏó£¿

ÔÚ±¾ÎÄÖУ¬ÎÒ½«½âÊÍ ViewModel µÄ¹¤×÷Ô­Àí£¬²¢ÌÖÂÛÔÚÄúµÄ´úÂëÖÐʵÏÖ ViewModel µÄÓÅȱµã¡£ÎÒ»¹»á½éÉÜһЩ¾ßÌåµÄʾÀý£¬ÑÝʾÈçºÎʹÓà ViewModel ×÷ΪÎĵµ¹ÜÀíÆ÷£¬ÒÔ±ãÔÚ View ²ãÖÐÏÔʾ Model ¶ÔÏó¡£

Model¡¢ViewModel ºÍ View

µ½Ä¿Ç°ÎªÖ¹£¬ÎÒÉè¼Æ¹ýµÄÿ¸ö WPF ºÍ Silverlight Ó¦ÓóÌÐò¶¼¾ßÓÐÏàͬµÄ¸ß²ã×é¼þÉè¼Æ¡£Model ÊÇÓ¦ÓóÌÐòµÄºËÐÄ£¬ÐèҪͶÈë´óÁ¿¾«Á¦£¬°´ÕÕÃæÏò¶ÔÏóµÄ·ÖÎöºÍÉè¼Æ (OOAD) ×î¼Ñ×ö·¨½øÐÐÉè¼Æ¡£

¶ÔÎÒÀ´Ëµ£¬Model ÊÇÓ¦ÓóÌÐòµÄºËÐÄ£¬´ú±í×Å×î´ó¡¢×îÖØÒªµÄÒµÎñ×ʲú£¬ÒòΪËü¼Ç¼ÁËËùÓи´ÔÓµÄÒµÎñʵÌå¡¢ËüÃÇÖ®¼äµÄ¹ØÏµÒÔ¼°ËüÃǵŦÄÜ¡£

Model Ö®ÉÏÊÇ ViewModel¡£ViewModel µÄÁ½¸öÖ÷ҪĿ±ê·Ö±ðÊÇ£ºÊ¹ Model Äܹ»ÇáËɱ» WPF/XAML View ʹÓ㻽« Model ´Ó View ·ÖÀë²¢¶Ô Model ½øÐзâ×°¡£ÕâЩĿ±êµ±È»·Ç³£ºÃ£¬µ«ÊÇÓÉÓÚһЩÏÖʵµÄÔ­Òò£¬ÓÐʱ²¢²»ÄÜ´ïµ½ÕâЩĿ±ê¡£

Äú¹¹½¨µÄ ViewModel ÖªµÀÓû§Ôڸ߲ãÉϽ«ÈçºÎÓëÓ¦ÓóÌÐò½»»¥¡£µ«ÊÇ£¬ViewModel ¶Ô View Ò»ÎÞËùÖª£¬ÕâÊÇ MVVM Éè¼ÆÄ£Ê½µÄÖØÒª²¿·Ö¡£ÕâʹµÃ½»»¥Éè¼ÆÊ¦ºÍͼÐÎÉè¼ÆÊ¦Äܹ»ÔÚ ViewModel µÄ»ù´¡ÉÏ´´½¨ÓÅÃÀ¡¢ÓÐЧµÄ UI£¬Í¬Ê±Ó뿪·¢ÈËÔ±ÃÜÇÐÅäºÏ£¬Éè¼ÆÊʵ±µÄ ViewModel À´Ö§³ÖÆä¹¤×÷¡£´ËÍ⣬View Óë ViewModel µÄ·ÖÀ뻹ʹµÃ ViewModel ¸üÓÐÀûÓÚµ¥Ôª²âÊÔºÍÖØÓá£

ΪÁËÔÚ Model¡¢View ºÍ ViewModel ²ãÖ®¼äʵʩÑϸñµÄ·ÖÀ룬ÎÒϲ»¶½«Ã¿Ò»²ã¹¹½¨ÎªÒ»¸öµ¥¶ÀµÄ Visual Studio ÏîÄ¿¡£Óë¿ÉÖØÓõÄʵÓù¤¾ß¡¢Ö÷ÒªµÄ¿ÉÖ´ÐгÌÐò¼¯ÒÔ¼°Èκε¥Ôª²âÊÔÏîÄ¿£¨ÄúÓдóÁ¿ÕâЩÄÚÈÝ£¬¶ÔÂ𣿣©½áºÏÖ®ºó£¬Õâ»á²úÉú´óÁ¿ÏîÄ¿ºÍ³ÌÐò¼¯£¬Èçͼ 1 Ëùʾ¡£

ͼ 1 MVVM Ó¦ÓóÌÐòµÄ×é³É²¿·Ö

ÓÉÓÚÕâÖÖÑϸñ·ÖÀëµÄ·½·¨»á²úÉú´óÁ¿ÏîÄ¿£¬Òò´ËËüÏÔÈ»×îÊʺϴóÐÍÏîÄ¿¡£¶ÔÓÚÖ»ÓÐÒ»Á½Î»¿ª·¢ÈËÔ±µÄСÐÍÓ¦ÓóÌÐòÀ´Ëµ£¬ÕâÖÖÑϸñ·ÖÀë´øÀ´µÄºÃ´¦¿ÉÄÜÎÞ·¨µÖÏû´´½¨¡¢ÅäÖúÍά»¤¶à¸öÏîÄ¿Ëù´øÀ´µÄ²»±ã£¬Òò´Ë½ö½ö½«ÄúµÄ´úÂë·ÖÀ뵽ͬһ¸öÏîÄ¿µÄ²»Í¬ÃüÃû¿Õ¼äÖУ¬¿ÉÄܱȳä·Ö¸ôÀë¸üºÃÓá£

±àдºÍά»¤ ViewModel ²¢²»ÈÝÒ×£¬²»Ó¦ÇáÂʵضԴý¡£µ«ÊÇ£¬Ò»Ð©×î»ù±¾ÎÊÌ⣨MVVM Éè¼ÆÄ£Ê½Ê²Ã´Ê±ºòÊÇÊÊÓõģ¬Ê²Ã´Ê±ºòÓÖÊDz»±ØÒªµÄ£©µÄ´ð°¸¾­³£°üº¬ÔÚÄúµÄÓòÄ£ÐÍÖС£

ÔÚ´óÐÍÏîÄ¿ÖУ¬ÓòÄ£ÐÍ¿ÉÄܷdz£¸´ÔÓ£¬ÐèÒª¾«ÐÄÉè¼ÆÊýÒ԰ټƵÄÀ࣬ʹËüÃÇÄܹ»ÔÚÈκÎÀàÐ͵ÄÓ¦ÓóÌÐò£¨°üÀ¨ Web ·þÎñ¡¢WPF »ò ASP.NET Ó¦ÓóÌÐò£©ÖÐ˳³©µØ½áºÏÔÚÒ»Æð¡£Model ¿ÉÄÜÓɼ¸¸öÏ໥ÅäºÏµÄ³ÌÐò¼¯×é³É£¬ÉõÖÁÔÚ³¬´óÐÍ×éÖ¯ÖУ¬ÓòÄ£ÐÍÓÐʱÊÇÓÉÒ»¸öרÃŵĿª·¢ÍŶӹ¹½¨ºÍά»¤µÄ¡£

Èç¹ûÄúÓÐÒ»¸ö¸´ÔӵĴóÐÍÓòÄ£ÐÍ£¬ÔòÒýÈë ViewModel ²ã¼¸ºõ×ÜÊÇ»á´øÀ´ºÃ´¦¡£

ÁíÒ»·½Ã棬ÓòÄ£ÐÍÓÐʱºÜ¼òµ¥£¬¿ÉÄܽö½öÊǸ²¸ÇÔÚÊý¾Ý¿âÉϵÄÒ»¸ö±¡²ã¡£Àà¿ÉÒÔ×Ô¶¯Éú³É£¬¶øÇÒͨ³£»áʵÏÖ INotifyPropertyChanged¡£UI ͨ³£ÊÇһϵÁпɹ©±à¼­µÄÁбí»ò±í¸ñ£¬ÔÊÐíÓû§¶Ôµ×²ãÊý¾Ý½øÐвÙ×÷¡£Microsoft ¹¤¾ß¼¯Ò»Ö±¶¼¼«ÆäÉó¤ÇáËÉ¿ì½ÝµØ¹¹½¨ÕâÀàÓ¦ÓóÌÐò¡£

Èç¹ûÄúµÄÄ£ÐÍ»òÓ¦ÓóÌÐòÊÇÕâÖÖÀàÐ͵ģ¬Ôò ViewModel ºÜ¿ÉÄÜ»á´øÀ´ÄÑÒÔ½ÓÊܵĸ߿ªÏú£¬¶ø¶ÔÄúµÄÓ¦ÓóÌÐòÉè¼Æ²¢Ã»ÓÐ×ã¹»µÄºÃ´¦¡£

¾¡¹ÜÈç´Ë£¬¼´Ê¹ÔÚÕâЩÇé¿öÏ£¬ViewModel Ò²ÈÔÈ»ÓÐÆä¼ÛÖµ¡£ÀýÈ磬ViewModel ·Ç³£ÊʺÏÓÃÀ´ÊµÏÖ¡°³·Ïû¡±¹¦ÄÜ¡£ÁíÍ⣬ÄúÒ²¿ÉÒÔÑ¡ÔñÔÚÓ¦ÓóÌÐòµÄij¸ö²¿·Ö£¨ÀýÈçÎĵµ¹ÜÀí£¬ÎÒ½«ÔÚºóÃæÌÖÂÛ£©Ê¹Óà MVVM Ö±½ÓÏò View Ìṩ Model¡£

ΪʲôҪʹÓà ViewModel£¿

¼´Ê¹ ViewModel ¿´ÆðÀ´ÊʺÏÄúµÄÓ¦ÓóÌÐò£¬ÔÚ¿ªÊ¼±àд´úÂë֮ǰ£¬ÈÔÈ»»¹ÓÐÎÊÌâÐèÒª½â´ð¡£ÆäÖÐ×îÖØÒªµÄÎÊÌâÊÇÈçºÎ¼õÉÙ´úÀíÊôÐÔµÄÊýÁ¿¡£

MVVM Éè¼ÆÄ£Ê½½« View ´Ó Model ·ÖÀ룬ÕâÖÖ×ö·¨ÊǸÃģʽµÄÒ»¸öÖØÒªÇÒÓмÛÖµµÄ·½Ãæ¡£Òò´Ë£¬Èç¹û Model ÀàÓÐ 10 ¸öÊôÐÔÐèÒªÔÚ View ÖÐÏÔʾ³öÀ´£¬Ôò ViewModel ×îÖÕͨ³£»áÓÐ 10 ¸öµÈЧµÄÊôÐÔ£¬ÕâЩÊôÐÔÖ»ÊÇ´úÀíÁ˶ԵײãÄ£ÐÍʵÀýµÄµ÷Óá£ÕâЩ´úÀíÊôÐÔÔÚÉèÖÃʱͨ³£»áÒý·¢ÊôÐÔ¸ü¸Äʼþ£¬Í¨Öª View ¸ÃÊôÐÔÒѸü¸Ä¡£

²¢·Çÿ¸ö Model ÊôÐÔ¶¼ÒªÓÐ ViewModel ´úÀíÊôÐÔ£¬µ«ÊÇÿ¸öÐèÒªÔÚ View ÖÐÏÔʾµÄ Model ÊôÐÔͨ³£¶¼ÓÐÒ»¸ö´úÀíÊôÐÔ¡£´úÀíÊôÐÔͨ³£ÈçÏÂËùʾ£º

public string Description {
get { return this.UnderlyingModelInstance.Description; }
set { this.UnderlyingModelInstance.Description = value;
this.RaisePropertyChangedEvent("Description"); }}

ÈκÎÉÔ΢¸´ÔÓÒ»µãµÄÓ¦ÓóÌÐò¶¼»áÓÐÊýÊ®»òÉÏ°ÙµÄ Model À࣬ÕâЩÀà¶¼ÐèÒª°´ÕâÖÖ·½Ê½£¬Í¨¹ý ViewModel ÏòÓû§ÏÔʾ³öÀ´¡£ÕâÕýÊÇ MVVM ËùÌṩµÄ·ÖÀëµÄ±¾ÖÊ¡£

±àдÕâЩ´úÀíÊôÐԺܷ±Ëö£¬Òò´ËºÜÈÝÒ׳ö´í£¬ÓÈÆäÊÇÔÚÒý·¢ÊôÐÔ¸ü¸ÄʼþʱÐèÒªÒ»¸ö×Ö·û´®£¬¸Ã×Ö·û´®±ØÐëÓëÊôÐÔµÄÃû³ÆÏàÆ¥Å䣨²¢ÇÒ²»»á°üº¬ÔÚÈκÎ×Ô¶¯´úÂëÖØ¹¹ÖУ©¡£ÎªÁËÏû³ýÕâЩ´úÀíʼþ£¬³£¼ûµÄ½â¾ö·½·¨ÊÇÖ±½Ó´Ó ViewModel °ü×°Æ÷ÏÔʾģÐÍʵÀý£¬È»ºóÈÃÓòÄ£ÐÍʵÏÖ INotifyPropertyChanged ½Ó¿Ú£º

public class SomeViewModel {
public SomeViewModel( DomainObject domainObject )
{
Contract.Requires(domainObject!=null, "The domain object to wrap must not be null");
this.WrappedDomainObject = domainObject;
}
public DomainObject WrappedDomainObject
{ get; private set; }...

½èÖúÕâÖÖ·½·¨£¬View ¶Ô Model ÓÐÒ»¶¨µÄÒÀÀµÐÔ£¬µ«ÊÇÕâ½ö½öÊÇͨ¹ýÊý¾Ý°ó¶¨ÊµÏֵļä½ÓÒÀÀµ£¬¶ø²»ÐèÒª´Ó View ÏîÄ¿¶Ô Model ÏîÄ¿½øÐÐÏîÄ¿ÒýÓá£Òò´Ë£¬´¿´â´ÓʵÓýǶȳö·¢£¬´Ë·½·¨ÓÐʱºòºÜÓÐÓá£

µ«ÊÇ£¬´Ë·½·¨Êµ¼ÊÉÏÎ¥±³ÁË MVVM Éè¼ÆÄ£Ê½µÄ¾«Éñ£¬²¢ÇһήµÍÄúÔÚ½«À´ÒýÈëРViewModel ¹¦ÄÜ£¨ÀýÈç¡°³·Ïû¡±¹¦ÄÜ£©Ê±µÄÄÜÁ¦¡£ÎÒÓöµ½¹ýÕâÖÖ·½·¨µ¼Ö´óÁ¿·µ¹¤µÄÇé¿ö¡£ÏëÏóÒ»ÏÂÕâÖÖ²¢²»º±¼ûµÄÇé¿ö£ºÉî¶ÈǶÌ×µÄÊôÐÔÉÏÓÐÒ»¸öÊý¾Ý°ó¶¨¡£Èç¹û Person ViewModel Êǵ±Ç°µÄÊý¾ÝÉÏÏÂÎÄ£¬ÇÒ Person ÓµÓÐ Address£¬ÔòÊý¾Ý°ó¶¨¿ÉÄÜÈçÏÂËùʾ£º

{Binding WrappedDomainObject.Address.Country}

Èç¹ûÄú»¹ÐèÒªÔÚ Address ¶ÔÏóÉÏÒýÈë¸ü¶à ViewModel ¹¦ÄÜ£¬Äú¾ÍÐèҪɾ³ý¶Ô WrappedDomainObject.Address µÄÊý¾Ý°ó¶¨ÒýÓ㬶ø¸ÄΪʹÓÃÐ嵀 ViewModel ÊôÐÔ¡£Õâ¾Í»á´øÀ´ÎÊÌ⣬ÒòΪ¶Ô XAML Êý¾Ý°ó¶¨£¨¿ÉÄÜ»¹°üÀ¨Êý¾ÝÉÏÏÂÎÄ£©µÄ¸üкÜÄѽøÐвâÊÔ¡£View ×é¼þûÓÐ×Ô¶¯»¯µÄÈ«Ãæ»Ø¹é²âÊÔ¡£

¶¯Ì¬ÊôÐÔ

ÎÒ½â¾ö´úÀíÊôÐÔ¹ý¶àµÄ·½·¨ÊÇʹÓÃÐ嵀 .NET Framework 4 ÒÔ¼°Ö§³Ö¶¯Ì¬¶ÔÏóºÍ¶¯Ì¬·½·¨µ÷¶ÈµÄ WPF¡£ºóÕßʹÄúÄܹ»ÔÚÔËÐÐʱ¾ö¶¨ÈçºÎ´¦ÀíÀàÉϲ¢²»´æÔÚµÄÊôÐԵĶÁд²Ù×÷¡£ÕâÒâζ×ÅÄú¿ÉÒÔÏû³ý ViewModel ÖеÄËùÓÐÊÖдµÄ´úÀíÊôÐÔ£¬Í¬Ê±ÈÔÄÜ·â×°µ×²ãÄ£ÐÍ¡£µ«ÊÇÇë×¢Ò⣬Silverlight 4 ²»Ö§³Ö°ó¶¨µ½¶¯Ì¬ÊôÐÔ¡£

ʵÏִ˹¦ÄܵÄ×î¼òµ¥·½·¨ÊÇÈà ViewModel »ùÀàÀ©Õ¹Ð嵀 System.Dynamic.DynamicObject À࣬²¢ÖØÐ´ TryGetMember ºÍ TrySetMember ³ÉÔ±¡£µ±±»ÒýÓõÄÊôÐÔÔÚÀàÉϲ»´æÔÚʱ£¬¶¯Ì¬ÓïÑÔÔËÐÐʱ (DLR) ¾Í»áµ÷ÓÃÕâÁ½¸ö·½·¨£¬Ê¹¸ÃÀàÄܹ»ÔÚÔËÐÐʱ¾ö¶¨ÈçºÎʵÏÖȱÉÙµÄÊôÐÔ¡£½áºÏÉÙÁ¿µÄ·´ÉäÖ®ºó£¬Ö»Ðè±àд¼¸ÐдúÂ룬ViewModel Àà¾ÍÄܶ¯Ì¬´úÀí¶Ôµ×²ãÄ£ÐÍʵÀýµÄÊôÐÔ·ÃÎÊ£º

public override bool TryGetMember(
GetMemberBinder binder, out object result)

{ string propertyName = binder.Name; PropertyInfo

property = this.WrappedDomainObject.GetType().GetProperty

(propertyName); if( property==null || property.

CanRead==false ) { result = null; return false; }

result = property.GetValue(this.WrappedDomainObject,

null); return true;}

¸Ã·½·¨¿ªÊ¼Ê±Ê¹Ó÷´ÉäÀ´²éÕҵײã Model ʵÀýÉϵÄÊôÐÔ¡££¨ÓйØÏêϸÐÅÏ¢£¬Çë²Î¼û 2007 Äê 6 Ôµġ°CLR È«ÃæÍ¸Îö¡±×¨À¸·´ÉäÖ®·´Ë¼¡££©Èç¹û¸ÃÄ£ÐÍûÓÐÕâÑùÒ»¸öÊôÐÔ£¬¸Ã·½·¨½«Ê§°Ü²¢·µ»Ø False£¬Êý¾Ý°ó¶¨Ò²Ê§°Ü¡£Èç¹ûÊôÐÔ´æÔÚ£¬¸Ã·½·¨½«Ê¹ÓÃÊôÐÔÐÅÏ¢À´¼ìË÷²¢·µ»Ø Model µÄÊôÐÔÖµ¡£Ó봫ͳ´úÀíÊôÐ﵀ get ·½·¨Ïà±È£¬ÕâÊǶîÍâµÄ¹¤×÷£¬µ«ÕâÒ²ÊÇÄúÐèҪΪËùÓÐÄ£ÐͺÍËùÓÐÊôÐÔ±àдµÄΨһʵÏÖ¡£

¶¯Ì¬´úÀíÊôÐÔ·½·¨µÄÕæÕýÇ¿´óÖ®´¦ÔÚÓÚÊôÐÔÉèÖÃÆ÷¡£ÔÚ TrySetMember ÖУ¬Äú¿ÉÒÔ°üº¬³£¼ûµÄÂß¼­£¬ÀýÈçÒý·¢ÊôÐÔ¸ü¸Äʼþ¡£Æä´úÂëÈçÏÂËùʾ£º

public override bool TrySetMember( SetMemberBinder

binder, object value)
{
string propertyName = binder.Name;
PropertyInfo property = this.WrappedDomainObject.GetType().GetProperty

(propertyName);
if( property==null || property.CanWrite==false )
return false;
property.SetValue(this.WrappedDomainObject,

value, null);
this.RaisePropertyChanged(propertyName);
return true;}

ͬÑù£¬¸Ã·½·¨¿ªÊ¼Ê±Ê¹Ó÷´Éä´Óµ×²ã Model ʵÀý»ñÈ¡ÊôÐÔ¡£Èç¹ûÊôÐÔ²»´æÔÚ»òÊÇÖ»¶ÁµÄ£¬¸Ã·½·¨½«Ê§°Ü²¢·µ»Ø False¡£Èç¹ûÊôÐÔ´æÔÚÓÚÓò¶ÔÏóÉÏ£¬½«Ê¹ÓÃÊôÐÔÐÅÏ¢À´ÉèÖà Model ÊôÐÔ¡£È»ºóÄú¾Í¿ÉÒÔ°üº¬¶ÔËùÓÐÊôÐÔÉèÖÃÆ÷¾ùͨÓõÄÂß¼­¡£ÔÚ´ËʾÀý´úÂëÖУ¬ÎÒÖ»ÊÇΪ¸Õ²ÅÉèÖõÄÊôÐÔÒý·¢ÁËÊôÐÔ¸ü¸Äʼþ£¬µ«Äú¿ÉÒÔÇáËÉÍê³É¸ü¶àÈÎÎñ¡£

·â×° Model µÄÒ»´óÄѵãÊÇ Model ¾­³£¾ßÓÐͳһ½¨Ä£ÓïÑÔ (Unified Modeling Language, UML) ³ÆÎª¡°ÅÉÉúÊôÐÔ¡±µÄÊôÐÔ¡£ÀýÈ磬Person Àà¿ÉÄܾßÓÐ BirthDate ÊôÐÔºÍÅÉÉúµÄ Age ÊôÐÔ¡£Age ÊôÐÔÊÇÖ»¶ÁµÄ£¬»á¸ù¾ÝÉúÈպ͵±Ç°ÈÕÆÚ×Ô¶¯¼ÆËãÄêÁ䣺

public class Person : DomainObject {
public DateTime BirthDate { get; set; }
public int Age {
get { var today = DateTime.Now; // Simplified demo code!
int age = today.Year - this.BirthDate.Year;
return age; } }...

µ± BirthDate ÊôÐÔ¸ü¸Äʱ£¬Age ÊôÐÔÒ²ËæÖ®¸ü¸Ä£¬ÒòΪÄêÁäÊǸù¾ÝÉúÈÕͨ¹ýÊýѧ·½·¨¼ÆËãµÃµ½µÄ¡£Òò´ËÔÚÉèÖà BirthDate ÊôÐÔʱ£¬ViewModel ÀàÐèҪͬʱΪ BirthDate ÊôÐÔºÍ Age ÊôÐÔÒý·¢ÊôÐÔ¸ü¸Äʼþ¡£½èÖú¶¯Ì¬ ViewModel ·½·¨£¬Äú¿ÉÒÔÔÚÄ£ÐÍÖÐÏÔʽ±í´ï³öÕâÖÖÄÚ²¿ÊôÐÔ¹ØÏµ£¬´Ó¶ø×Ô¶¯Íê³É´Ë²Ù×÷¡£

Ê×ÏÈ£¬ÄúÐèÒªÒ»¸ö×Ô¶¨ÒåÌØÐÔÀ´¼Ç¼ÊôÐÔ¹ØÏµ£º

[AttributeUsage(AttributeTargets.Property,

AllowMultiple=true)]
public sealed class AffectsOtherPropertyAttribute :

Attribute
{
public AffectsOtherPropertyAttribute( string

otherPropertyName)
{
this.AffectsProperty = otherPropertyName;
}
public string AffectsProperty { get; private

set; }}

ÎÒ½« AllowMultiple ÉèÖÃΪ True£¬ÒÔ±ãÖ§³ÖÒ»¸öÊôÐÔÄܹ»Ó°ÏìÆäËû¶à¸öÊôÐÔµÄÇé¿ö¡£Ó¦ÓôËÌØÐÔÀ´½« BirthDate ºÍ Age Ö®¼äµÄ¹ØÏµÖ±½Ó±àд½øÄ£Ð͵ĴúÂ룬ÕâÖÖ²Ù×÷·Ç³£¼òµ¥£º

[AffectsOtherProperty("Age")]public DateTime BirthDate { get; set; }

ΪÁËÔÚ¶¯Ì¬ ViewModel ÀàÖÐʹÓÃÕâÖÖеÄÄ£ÐÍÔªÊý¾Ý£¬ÎÒÏÖÔÚ¿ÉÒÔÔÚ TrySetMember ·½·¨ÖÐÌí¼ÓÈýÐдúÂ룬ʹÆäÈçÏÂËùʾ£º

this.RaisePropertyChanged( otherPropertyAttr.AffectsProperty);}

ÖØÒªµÄÊÇÒªÈÏʶµ½£¬Èç¹ûÄú¶Ô¶¯Ì¬ ViewModel Àࣨ¸üÓпÉÄÜÊǾßÌåÄ£ÐÍÅÉÉúµÄ ViewModel ÀࣩÉϵÄij¸öÊôÐÔÖ´ÐÐÏÔʽ±à³Ì²Ù×÷£¬DLR ²»»áµ÷Óà TryGetMember ºÍ TrySetMember ·½·¨£¬¶ø¸ÄΪֱ½Óµ÷ÓÃÕâЩÊôÐÔ¡£ÔÚÕâÖÖÇé¿öÏ£¬Äú»á¶ªÊ§ÕâÖÖ×Ô¶¯ÐÐΪ¡£µ«ÊÇ£¬Äú¿ÉÒÔÇáËÉÖØ¹¹´úÂ룬ʹµÃ×Ô¶¨ÒåÊôÐÔÒ²ÄÜʹÓô˹¦ÄÜ¡£

ÈÃÎÒÃǻص½Éî¶ÈǶÌ×ÊôÐÔÉϵÄÊý¾Ý°ó¶¨ÎÊÌ⣨ÔÚÕâÖÖÇé¿öÏ£¬ViewModel Êǵ±Ç° WPF Êý¾ÝÉÏÏÂÎÄ£©£¬Æä´úÂëÈçÏÂËùʾ£º

{Binding WrappedDomainObject.Address.Country}

ʹÓö¯Ì¬´úÀíÊôÐÔÒâζ×ŵײã°ü×°µÄÓò¶ÔÏó²»ÔÙÖ±½ÓÌṩ£¬Òò´ËÊý¾Ý°ó¶¨¿ÉÄÜʵ¼ÊÉÏÈçÏÂËùʾ£º

{Binding Address.Country}

ÔÚÕâÖÖÇé¿öÏ£¬Address ÊôÐÔÈÔÈ»Äܹ»Ö±½Ó·ÃÎʵײãÄ£Ð굀 Address ʵÀý¡£µ«ÊÇÏÖÔÚ£¬µ±ÄúÏ£ÍûÎ§ÈÆ Address ÒýÈë ViewModel ʱ£¬ÄúÖ»ÐèÏò Person ViewModel ÀàÌí¼ÓÐÂÊôÐÔ¡£Ð嵀 Address ÊôÐԷdz£¼òµ¥£º

public DynamicViewModel Address {
get {
if( addressViewModel==null ) addressViewModel = new DynamicViewModel(this.Person.Address);
return addressViewModel; }}
private DynamicViewModel addressViewModel;

²»ÐèÒª¸ü¸ÄÈκΠXAML Êý¾Ý°ó¶¨£¬ÒòΪ¸ÃÊôÐÔÈÔÈ»ÃûΪ Address£¬µ«ÊÇÏÖÔÚ DLR µ÷ÓÃеÄʵ¼ÊÊôÐÔ£¬¶ø²»Êǵ÷Óö¯Ì¬ TryGetMember ·½·¨¡££¨Çë×¢Ò⣬´Ë Address ÊôÐÔÖеÄÑÓ³ÙʵÀý»¯²»ÊÇḬ̈߳²È«µÄ¡£µ«ÊÇ£¬Ö»ÓÐÕýÔÚ·ÃÎÊ ViewModel ºÍ WPF/Silverlight ÊÓͼµÄ View Êǵ¥Ï̵߳ģ¬Òò´ËÕâ²»³ÉÎÊÌâ¡££©

ÉõÖÁµ±Ä£ÐÍʵÏÖ INotifyPropertyChanged ʱ£¬Ò²¿ÉÒÔʹÓô˷½·¨¡£ViewModel »á×¢Òâµ½ÕâÖÖÇé¿ö£¬²¢ÇÒÑ¡Ôñ²»Í¨¹ý´úÀíÀ´Òý·¢ÊôÐÔ¸ü¸Äʼþ¡£ÔÚÕâÖÖÇé¿öÏ£¬Ëü»á´Óµ×²ãÄ£ÐÍʵÀýÕìÌýÕâЩʼþ£¬È»ºó×ÔÐÐÖØÐÂÒý·¢Ê¼þ¡£ÔÚ¶¯Ì¬ ViewModel ÀàµÄ¹¹Ô캯ÊýÖУ¬ÎÒÖ´ÐÐÁ˼ì²é²¢¼ÇÏÂÁ˽á¹û£º

1 public DynamicViewModel(DomainObject model)
{
Contract.Requires(model != null, "Cannot encapsulate a null model");
this.ModelInstance = model; // Raises its own property changed events
if( model is INotifyPropertyChanged )
{
this.ModelRaisesPropertyChangedEvents = true;
var raisesPropChangedEvents = model as INotifyPropertyChanged;
raisesPropChangedEvents.PropertyChanged += (sender,args) => this.RaisePropertyChanged(args.PropertyName); }}

ΪÁË·ÀÖ¹ÖØ¸´ÊôÐÔ¸ü¸Äʼþ£¬ÎÒ»¹ÐèÒª¶Ô TrySetMember ·½·¨ÉÔ×öÐ޸ġ£

if( this.ModelRaisesPropertyChangedEvents==false )
this.RaisePropertyChanged(property.Name);

Òò´Ë£¬Äú¿ÉÒÔʹÓö¯Ì¬´úÀíÊôÐÔÀ´Ïû³ý±ê×¼µÄ´úÀíÊôÐÔ£¬´Ó¶ø´ó´ó¼ò»¯ ViewModel ²ã¡£Õâ¿ÉÒÔ´ó´ó¼õÉÙ±àд´úÂë¡¢²âÊÔ¡¢ÎĵµºÍ³¤ÆÚά»¤¹¤×÷¡£ÏòÄ£ÐÍÖÐÌí¼ÓÐÂÊôÐÔ²»ÔÙÐèÒª¸üРViewModel ²ã£¬³ý·ÇÐÂÊôÐÔÓµÓзdz£ÌØÊâµÄ View Âß¼­¡£¶øÇÒ£¬ÕâÖÖ·½·¨¿ÉÒÔ½â¾ö¹ØÁªÊôÐÔµÈÄÑÌâ¡£³£ÓÃµÄ TrySetMember ·½·¨Ò²ÄܰïÄúʵÏÖ¡°³·Ïû¡±¹¦ÄÜ£¬ÒòΪÓÉÓû§Ö´ÐеÄÊôÐÔ¸ü¸ÄÈ«²¿¶¼»áÁ÷¾­ TrySetMember ·½·¨¡£

ÓŵãºÍȱµã

ÓÉÓÚÐÔÄÜÎÊÌ⣬Ðí¶à¿ª·¢ÈËÔ±¶¼²»Ô¸ÒâʹÓ÷´É䣨ºÍ DLR£©¡£ÔÚÎÒ×Ô¼ºµÄ¹¤×÷ÖУ¬ÎÒ»¹Ã»Óз¢ÏÖÕâ»á´øÀ´ÎÊÌâ¡£ÔÚ UI ÖÐÉèÖõ¥¸öÊôÐÔʱËùÔì³ÉµÄÐÔÄÜËðʧ£¬Óû§ºÜ¿ÉÄܲ»»á×¢Òâµ½¡£µ±È»£¬Õâ¿ÉÄܲ»ÊÊÓÃÓڸ߶ÈÃô¸ÐµÄ½»»¥Ê½ UI£¬ÀýÈç¶àµã´¥ÃþÉè¼ÆÍ¼Ãæ¡£

Î¨Ò»ÖØ´óµÄÐÔÄÜÎÊÌâ³öÏÖÔÚ³õ´ÎÌî³äÓдóÁ¿×ֶεÄÊÓͼʱ¡£Ò×ÓÃÐÔ·½ÃæµÄ¿¼ÂǺÜ×ÔÈ»µØ¾Í»áÏÞÖÆÄúÔÚÆÁÄ»ÉÏÏÔʾµÄ×Ö¶ÎÊý£¬Òò´Ëͨ¹ýÕâÖÖ DLR ·½·¨Ö´ÐгõʶÊý¾Ý°ó¶¨Ê±µÄÐÔÄܺÜÄѱ»È˲ì¾õ¡£

²»¹ý£¬Ê¼ÖÕÓ¦¸Ã×Ðϸ¼à¿ØÐÔÄÜ£¬²¢ÇÒÒªÀí½âÐÔÄÜÓëÓû§ÌåÑéµÄ¹ØÏµ¡£Ç°ÎÄËùÊöµÄ¼òµ¥·½·¨¿Éͨ¹ý·´É仺´æÀ´¸Äд¡£Óйظü¶àÏêÇ飬Çë²Î¼û MSDN ÔÓÖ¾£¨2005 Äê 7 Ô£©Öп¯ÔØµÄ Joel Pobar µÄÎÄÕ¡£

ÓÐÈËÈÏΪʹÓô˷½·¨»á¶Ô´úÂëµÄ¿É¶ÁÐÔºÍÒ×ά»¤ÐÔ²úÉú¸ºÃæÓ°Ï죬ÕâÖÖÒìÒéÓÐÒ»¶¨µÄµÀÀí£¬ÒòΪ View ²ãËÆºõÊÇÔÚÒýÓà ViewModel Éϲ¢²»Êµ¼Ê´æÔÚµÄÊôÐÔ¡£µ«ÊÇ£¬ÎÒÏàÐÅÏû³ý´ó²¿·ÖÊÖ¹¤±àдµÄ´úÀíÊôÐÔËù²úÉúµÄºÃ´¦ÒªÔ¶Ô¶³¬¹ýÆä´øÀ´µÄÎÊÌ⣬ÓÈÆäÊÇÔÚ ViewModel ÓµÓÐÍêÉÆµÄÎĵµµÄÇé¿öÏ¡£

¶¯Ì¬´úÀíÊôÐÔ·½·¨²»»á½µµÍ»òÈ¡Ïû´òÂÒ Model ²ãµÄÄÜÁ¦£¬ÒòΪ Model ÉϵÄÊôÐÔÏÖÔÚÊÇͨ¹ýÃû³ÆÔÚ XAML ÖÐÒýÓõġ£Ê¹Óô«Í³´úÀíÊôÐÔ²»»áÏÞÖÆÄú´òÂÒ Model µÄÄÜÁ¦£¬ÕâÊÇÒòΪÊôÐÔÊÇÖ±½ÓÒýÓõ쬻áÓëÓ¦ÓóÌÐòµÄÆäÓಿ·ÖÒ»Æð´òÂÒ¡£µ«ÊÇ£¬ÓÉÓÚ´ó¶àÊý´òÂÒ¹¤¾ß»¹²»ÄÜ´¦Àí XAML/BAML£¬Òò´ËÕâ»ù±¾ÉÏûʲô×÷Óá£ÔÚÁ½ÖÖÇé¿öÏ£¬´úÂëÆÆ½âÕß¶¼¿ÉÒÔ´Ó XAML/BAML ÈëÊÖ£¬Öð²½½øÈë Model ²ã¡£

×îºó£¬ÓÉÓÚÄ£ÐÍÊôÐÔ¾ßÓа²È«Ïà¹ØÔªÊý¾Ý²¢ÇÒÏ£Íû ViewModel ¸ºÔðʵʩ°²È«ÎÊÌ⣬ÕâÖÖ·½·¨¿ÉÄܻᱻÀÄÓᣰ²È«ÐÔ¿´ÆðÀ´²»ÊÇ View ÌØÓеÄÔðÈΣ¬ÎÒÏàÐÅÕâ¸ø ViewModel ¸³ÓèÁËÌ«¶àÔðÈΡ£ÔÚÕâÖÖÇé¿öÏ£¬ÔÚ Model ÖÐÓ¦ÓÃÃæÏò·½ÃæµÄ·½·¨£¬¿ÉÄÜÊǸüÇ¡µ±µÄ×ö·¨¡£

¼¯ºÏ

¼¯ºÏÊÇ MVVM Éè¼ÆÄ£Ê½ÖÐ×îÄÑ¡¢×î²»ÄÜÈÃÈËÂúÒâµÄ·½ÃæÖ®Ò»¡£Èç¹ûµ×²ã Model Öеļ¯ºÏ±» Model ¸ü¸ÄÁË£¬½«ÓÉ ViewModel ¸ºÔðÒÔijÖÖ·½Ê½À´´«´ï¸Ã¸ü¸Ä£¬Ê¹ View Äܹ»ÏàÓ¦µØ¸ü¸ÄÆä±¾Éí¡£

Òź¶µÄÊÇ£¬Model ºÜ¿ÉÄܲ»»á¹«¿ªÊµÏÖ INotifyCollectionChanged ½Ó¿ÚµÄ¼¯ºÏ¡£ÔÚ .NET Framework 3.5 ÖУ¬´Ë½Ó¿ÚλÓÚ System.Windows.dll ÖУ¬¶øÎÒÃÇÇ¿ÁÒ½¨ÒéÄú²»ÒªÔÚ Model ÖÐʹÓøÿ⡣ÐÒºÃÔÚ .NET Framework 4 ÖУ¬´Ë½Ó¿ÚÒÑÇ¨ÒÆµ½ System.dll ÖУ¬Òò´ËÔÚ Model ÖÐʹÓÿɼû¼¯ºÏ¾Í»á×ÔÈ»µÃ¶à¡£

Model ÖеĿɼû¼¯ºÏΪ Model ¿ª·¢ÌṩÁËеĻú»á£¬²¢ÇÒ¿ÉÓÃÔÚ Windows ´°ÌåºÍ Silverlight Ó¦ÓóÌÐòÖС£Ä¿Ç°£¬ÕâÊÇÎÒÊ×Ñ¡µÄ·½·¨£¬ÒòΪËü±ÈÆäËûÈκη½·¨¶¼¼òµ¥£¬ÎҺܸßÐË INotifyCollectionChanged ½Ó¿ÚÒÆµ½ÁËÒ»¸ö¸ü³£ÓõijÌÐò¼¯ÖС£

Èç¹û Model ÖÐûÓпɼû¼¯ºÏ£¬×îºÃµÄ×ö·¨ÊÇÔÚ Model ÉÏÌṩÆäËûijÖÖ»úÖÆ£¨×îÓпÉÄܵÄÊÇ×Ô¶¨Òåʼþ£©£¬À´Ö¸Ê¾¼¯ºÏºÎʱ·¢ÉúÁ˸ü¸Ä¡£Õâ¿ÉÒÔͨ¹ý Model ÌØÓеķ½Ê½Íê³É¡£ÀýÈ磬Èç¹û Person ÀàÓÐÒ»¸öµØÖ·¼¯ºÏ£¬ÔòËü¿ÉÒÔÌṩÈçÏÂʼþ£º

public event EventHandler<AddressesChangedEventArgs> NewAddressAdded;
public event EventHandler<AddressesChangedEventArgs> AddressRemoved;

×îºÃÒý·¢×¨ÃÅΪ WPF ViewModel Éè¼ÆµÄ×Ô¶¨Ò弯ºÏʼþ¡£µ«ÊÇ£¬ÈÔÈ»ºÜÄÑÔÚ ViewModel Öй«¿ª¼¯ºÏµÄ¸ü¸Ä¡£Í¬Ñù£¬Î¨Ò»µÄ°ì·¨ÊÇÔÚÕû¸ö ViewModel ¼¯ºÏÊôÐÔÉÏÒý·¢ÊôÐÔ¸ü¸Äʼþ¡£ÕâÖÖ½â¾ö·½·¨³äÆäÁ¿²»¹ýÊDzîÇ¿ÈËÒâ¡£

¼¯ºÏµÄÁíÒ»¸öÎÊÌâÊÇÈ·¶¨ºÎʱ»òÊÇ·ñÒª½«Ã¿¸ö Model ʵÀý°ü×°µ½ ViewModel ʵÀýÄڵļ¯ºÏÖС£¶ÔÓÚ½ÏСµÄ¼¯ºÏ£¬ViewModel ¿ÉÄܹ«¿ªÒ»¸öеĿɼû¼¯ºÏ£¬²¢½«µ×²ã Model ¼¯ºÏÖеÄÿһÏî¶¼¸´ÖƵ½ ViewModel ¿É¼û¼¯ºÏÖУ¬´Ó¶øÔÚÔËÐÐʱ½«Ã¿¸ö Model Ïî°ü×°µ½ÏàÓ¦ ViewModel ʵÀýÄڵļ¯ºÏÖС£ViewModel ¿ÉÄÜÐèÒªÕìÌý¼¯ºÏ¸ü¸Äʼþ£¬ÒԱ㽫Óû§¸ü¸Ä´«µÝ»Øµ×²ã Model¡£

µ«ÊÇ£¬¶ÔÓÚ´óÐͼ¯ºÏ¶øÑÔ£¬Ëü¿ÉÄÜ»áÏÔʾÔÚijÖÖÐÎʽµÄÐéÄâ»¯Ãæ°åÖУ¬Òò´Ë×î¼òµ¥¡¢×îʵÓõķ½·¨ÊÇÖ±½Ó¹«¿ª Model ¶ÔÏó¡£

ʵÀý»¯ ViewModel

MVVM Éè¼ÆÄ£Ê½ºÜÉÙÌÖÂÛµÄÁíÒ»¸öÎÊÌâÊÇÓ¦¸ÃÔںδ¦ÒÔ¼°ºÎʱʵÀý»¯ ViewModel ʵÀý¡£ÔÚÌÖÂÛÏàËÆµÄÉè¼ÆÄ£Ê½£¨ÀýÈç MVC£©Ê±£¬´ËÎÊÌâÒ²¾­³£»á±»ºöÊÓ¡£

ÎÒÇãÏòÓÚ±àд ViewModel µ¥Ò»ÊµÀýÀ´ÌṩÖ÷ÒªµÄ ViewModel ¶ÔÏó£¬Ê¹ View Äܹ»¸ù¾ÝÐèÒª£¬´Ó´Ë´¦ÇáËɼìË÷ÆäËûËùÓÐ ViewModel ¶ÔÏó¡£ÕâÖÖÖ÷¿Ø ViewModel ¶ÔÏóͨ³£»áÌṩÃüÁîʵÏÖ·½Ê½£¬Òò´Ë View Ö§³Ö´ò¿ªÎĵµ¡£

µ«ÊÇ£¬ÎÒ²ÎÓë¹ýµÄ´ó²¿·ÖÓ¦ÓóÌÐò¶¼ÌṩÁËÒÔÎĵµÎªÖÐÐĵĽçÃæ£¬¶øÇÒͨ³£Ê¹ÓÃÀàËÆÓÚ Visual Studio µÄÑ¡Ïʽ¹¤×÷Çø¡£Òò´ËÔÚ ViewModel ²ãÖУ¬ÎÒÏëÒÔÎĵµÎªÀý£¬¶øÇÒÎĵµÖÐÌṩÁËÒ»¸ö»ò¶à¸ö°ü×°ÁËÌØ¶¨ Model ¶ÔÏóµÄ ViewModel ¶ÔÏó¡£È»ºó£¬ViewModel ²ãÖеıê×¼ WPF ÃüÁî¿ÉÒÔʹÓó־ÃÐÔ²ãÀ´¼ìË÷±ØÒªµÄ¶ÔÏ󣬽«ËüÃǰü×°µ½ ViewModel ʵÀýÖУ¬È»ºó´´½¨ ViewModel Îĵµ¹ÜÀíÆ÷À´ÏÔʾËüÃÇ¡£

ÔÚ±¾Îĸ½´øµÄʾÀýÓ¦ÓóÌÐòÖУ¬ÓÃÓÚ´´½¨Ð Person µÄ ViewModel ÃüÁîΪ£º

internal class OpenNewPersonCommand : ICommand {... // Open a new person in a new window.
public void Execute(object parameter) {
var person = new MvvmDemo.Model.Person();
var document = new PersonDocument(person);
DocumentManager.Instance.ActiveDocument = document; }
}

×îºóÒ»ÐÐÖÐÒýÓÃµÄ ViewModel Îĵµ¹ÜÀíÆ÷ÊǹÜÀíËùÓдò¿ªµÄ ViewModel ÎĵµµÄµ¥Ò»ÊµÀý¡£ÎÊÌâÊÇ£¬ÈçºÎÔÚ View ÖÐÏÔʾ ViewModel ÎĵµµÄ¼¯ºÏÄØ£¿

ÄÚÖÃµÄ WPF Ñ¡Ï¿Ø¼þûÓÐÌṩÕâÖÖÓû§Ï£Íû»ñµÃµÄ¹¦ÄÜÇ¿´óµÄ¶àÎĵµ½çÃæ¡£ÐҺû¹ÓеÚÈý·½µÄÍ£¿¿ºÍÑ¡Ïʽ¹¤×÷Çø²úÆ·¿ÉÒÔʹÓá£ÆäÖд󲿷ֶ¼¾¡Á¦Ä£·Â Visual Studio µÄÑ¡ÏʽÎĵµÍâ¹Û£¬°üÀ¨¿ÉÍ£¿¿µÄ¹¤¾ß´°¿Ú¡¢²ð·ÖÊÓͼ¡¢Ctrl+Tab µ¯³ö´°¿Ú£¨´øÓÐ΢ÐÍÎĵµÊÓͼ£©¼°ÆäËû¹¦ÄÜ¡£

Òź¶µÄÊÇ£¬ÕâЩ×é¼þ´ó²¿·Ö¶¼Ã»ÓÐÌṩ¶Ô MVVM Éè¼ÆÄ£Ê½µÄÄÚÖÃÖ§³Ö¡£µ«ÊÇÕâҲû¹ØÏµ£¬ÒòΪÄú¿ÉÒÔÇáËÉÓ¦ÓÃÊÊÅäÆ÷Éè¼ÆÄ£Ê½£¬½« ViewModel Îĵµ¹ÜÀíÆ÷Á´½Óµ½µÚÈý·½ÊÓͼ×é¼þ¡£

Îĵµ¹ÜÀíÆ÷ÊÊÅäÆ÷

ͼ 2 ËùʾµÄÊÊÅäÆ÷Éè¼ÆÈ·±£ ViewModel ²»ÐèÒª¶Ô View µÄÈκÎÒýÓã¬Òò´ËËü·ûºÏ MVVM Éè¼ÆÄ£Ê½µÄÖ÷ҪĿ±ê¡££¨µ«ÔÚÕâÖÖÇé¿öÏ£¬ÎĵµµÄ¸ÅÄîÊÇÔÚ ViewModel ²ãÖУ¬¶ø²»ÊÇÔÚ Model ²ãÖж¨ÒåµÄ£¬ÒòΪÕâÊÇ´¿ UI ¸ÅÄî¡££©

ͼ 2 Îĵµ¹ÜÀíÆ÷ÊÓͼÊÊÅäÆ÷

ViewModel Îĵµ¹ÜÀíÆ÷¸ºÔðά»¤´ò¿ªµÄ ViewModel ÎĵµµÄ¼¯ºÏºÍÁ˽âÄĸöÎĵµµ±Ç°´¦Óڻ״̬¡£ÕâÖÖÉè¼ÆÊ¹ ViewModel ²ãÄܹ»Ê¹ÓÃÎĵµ¹ÜÀíÆ÷´ò¿ªºÍ¹Ø±ÕÎĵµÒÔ¼°¸ü¸Ä»î¶¯Îĵµ£¬¶øÎÞÐèÁ˽â View¡£´Ë·½·¨µÄ ViewModel ¶ËÏ൱¼òµ¥¡£Ê¾ÀýÓ¦ÓóÌÐòÖÐµÄ ViewModel ÀàÈçͼ 3 Ëùʾ¡£

ͼ 3 ViewModel ²ãµÄÎĵµ¹ÜÀíÆ÷ºÍ Document Àà

Document »ùÀàÌṩ¼¸ÖÖÄÚ²¿µÄÉúÃüÖÜÆÚ·½·¨£¨Activated¡¢LostActivation ºÍ DocumentClosed£©£¬ÕâЩ·½·¨ÓÉÎĵµ¹ÜÀíÆ÷µ÷Óã¬Ê¹ÎĵµÊ¼ÖÕ±£³Ö×îÐÂ״̬¡£Îĵµ»¹ÊµÏÖÁË INotifyPropertyChanged ½Ó¿Ú£¬Òò´ËËüÖ§³ÖÊý¾Ý°ó¶¨¡£ÀýÈ磬ÊÊÅäÆ÷½«ÊÓͼÎĵµµÄ Title ÊôÐÔÊý¾Ý°ó¶¨µ½ ViewModel µÄ DocumentTitle ÊôÐÔ¡£

´Ë·½·¨ÖÐ×ÔӵIJ¿·ÖÊÇÊÊÅäÆ÷À࣬ÎÒÔÚ±¾Îĸ½´øµÄÏîÄ¿ÖÐÌṩÁËÒ»¸öÄܹ»ÕýÈ·ÔËÐеĸ±±¾¡£ÊÊÅäÆ÷¶©ÔÄÎĵµ¹ÜÀíÆ÷ÉϵÄʼþ£¬²¢Ê¹ÓÃÕâЩʼþÀ´Ê¹Ñ¡Ïʽ¹¤×÷Çø¿Ø¼þ±£³Ö×îÐÂ״̬¡£ÀýÈ磬µ±Îĵµ¹ÜÀíÆ÷ָʾ´ò¿ªÁËÐÂÎĵµÊ±£¬ÊÊÅäÆ÷»áÊÕµ½Ò»¸öʼþ£¬½« ViewModel Îĵµ°ü×°µ½ËùÐèµÄ WPF ¿Ø¼þÖУ¬È»ºóÔÚÑ¡Ïʽ¹¤×÷ÇøÖÐÏÔʾ¸Ã¿Ø¼þ¡£

ÊÊÅäÆ÷»¹ÓÐÒ»ÏîÆäËûÈÎÎñ£ºÊ¹ ViewModel Îĵµ¹ÜÀíÆ÷ÓëÓû§µÄ²Ù×÷±£³Öͬ²½¡£Òò´Ë£¬ÊÊÅäÆ÷»¹±ØÐëÕìÌýÀ´×ÔÑ¡Ïʽ¹¤×÷Çø¿Ø¼þµÄʼþ£¬´Ó¶øÔÚÓû§¸ü¸Ä»î¶¯Îĵµ»ò¹Ø±ÕÎĵµÊ±£¬Í¨ÖªÎĵµ¹ÜÀíÆ÷¡£

´ËÂß¼­²¢²»Ê®·Ö¸´ÔÓ£¬µ«»¹ÊÇÓÐһЩҪעÒâµÄÊÂÏî¡£ÔÚÓÐЩÇé¿öÏ£¬´úÂë±äµÃ¿ÉÒÔÖØÐ½øÈ룬Òò´ËÕâÖÖÇé¿ö±ØÐëµÃµ½ÍêÉÆµÄ´¦Àí¡£ÀýÈ磬Èç¹û ViewModel ʹÓÃÎĵµ¹ÜÀíÆ÷À´¹Ø±ÕÎĵµ£¬ÊÊÅäÆ÷½«´ÓÎĵµ¹ÜÀíÆ÷ÊÕµ½Ê¼þ£¬²¢ÇÒÔÚÊÓͼÖйرÕʵ¼ÊµÄÎĵµ´°¿Ú¡£Õâ»áʹѡÏʽ¹¤×÷Çø¿Ø¼þÒ²Òý·¢Îĵµ¹Ø±Õʼþ£¬¶øÊÊÅäÆ÷Ò²»áÊÕµ½´Ëʼþ£¬²¢ÇÒÊÊÅäÆ÷µÄʼþ´¦Àí³ÌÐòµ±È»Ò²»á֪ͨÎĵµ¹ÜÀíÆ÷£º¸ÃÎĵµÓ¦±»¹Ø±Õ¡£¸ÃÎĵµÒѱ»¹Ø±Õ£¬Òò´ËÎĵµ¹ÜÀíÆ÷±ØÐëÄܹ»Ö§³ÖÕâÖÖÇé¿ö¡£

ÁíÒ»ÏîÄѵãÊÇ View µÄÊÊÅäÆ÷±ØÐëÄܹ»½« View µÄÑ¡ÏʽÎĵµ¿Ø¼þÁ´½Óµ½ ViewModel Document ¶ÔÏó¡£×î¿É¿¿µÄ½â¾ö·½·¨ÊÇʹÓà WPF Ïà¹ØÒÀÀµÊôÐÔ¡£ÊÊÅäÆ÷ÉùÃ÷ÁËÒ»¸ö˽ÓеÄÏà¹ØÒÀÀµÊôÐÔ£¬ÓÃÓÚ½« View ´°¿Ú¿Ø¼þÁ´½Óµ½Æä ViewModel ÎĵµÊµÀý¡£

ÔÚ±¾ÎĵÄʾÀýÏîÄ¿ÖУ¬ÎÒʹÓÃÁËÒ»¸ö¿ªÔ´µÄÑ¡Ïʽ¹¤×÷Çø×é¼þ AvalonDock£¬Òò´ËÎÒµÄÏà¹ØÒÀÀµÊôÐÔÀàËÆÓÚͼ 4 Ëùʾ¡£

ͼ 4 Á´½Ó View ¿Ø¼þºÍ ViewModel Îĵµ

private static readonly DependencyProperty ViewModelDocumentProperty = DependencyProperty.RegisterAttached( "ViewModelDocument", typeof(Document), typeof(DocumentManagerAdapter), null);
private static Document GetViewModelDocument( AvalonDock.ManagedContent viewDoc) {
return viewDoc.GetValue(ViewModelDocumentProperty) as Document;
}
private static void SetViewModelDocument( AvalonDock.ManagedContent viewDoc, Document document) {
viewDoc.SetValue(ViewModelDocumentProperty, document);
}

µ±ÊÊÅäÆ÷´´½¨Ð嵀 View ´°¿Ú¿Ø¼þʱ£¬Ëü»á½«Ð´°¿Ú¿Ø¼þÉϵÄÏà¹ØÊôÐÔÉèÖÃΪµ×²ã ViewModel Îĵµ£¨Çë²Î¼ûͼ 5£©¡£ÄúÒ²»á¿´µ½´Ë´¦ÅäÖÃÁ˱êÌâÊý¾Ý°ó¶¨£¬ÒÔ¼°ÊÊÅäÆ÷ÈçºÎÅäÖà View Îĵµ¿Ø¼þµÄÊý¾ÝÉÏÏÂÎĺÍÄÚÈÝ¡£

ͼ 5 ÉèÖÃÏà¹ØÊôÐÔ

private AvalonDock.DocumentContent Create

NewViewDocument( Document viewModelDocument) {
var viewDoc = new AvalonDock.DocumentContent();
viewDoc.DataContext = viewModelDocument;
viewDoc.Content = viewModelDocument;
Binding titleBinding = new Binding("DocumentTitle")

{
Source = viewModelDocument };
viewDoc.SetBinding(AvalonDock.ManagedContent.

TitleProperty,
titleBinding);
viewDoc.Closing += OnUserClosingDocument;
DocumentManagerAdapter.SetViewModelDocumen

t(viewDoc, viewModelDocument);
return viewDoc;
}

ͨ¹ýÉèÖà View Îĵµ¿Ø¼þµÄÄÚÈÝ£¬ÎÒÈà WPF ´¦Àí·±ÖØµÄÈÎÎñ£ºÕÒ³öÏÔʾÕâÖÖÌØ¶¨ÀàÐ굀 ViewModel ÎĵµµÄ·½·¨¡£ViewModel ÎĵµµÄʵ¼ÊÊý¾ÝÄ£°åλÓÚÖ÷ XAML ´°¿ÚËù°üº¬µÄ×ÊÔ´×ÖµäÖС£

ÎÒÒѾ­ÔÚ WPF ºÍ Silverlight Öгɹ¦Ê¹ÓùýÕâÖÖ ViewModel Îĵµ¹ÜÀíÆ÷·½·¨¡£½öÓÐµÄ View ²ã´úÂëÊÇÊÊÅäÆ÷£¬¶øÕâ¿ÉÒÔÇáËɽøÐвâÊÔ£¬È»ºó¾Í¿ÉÒÔËæËüÈ¥ÁË¡£ÕâÖÖ·½·¨Ê¹ ViewModel Óë View Ö®¼äÍêÈ«¶ÀÁ¢¡£ÎÒÔø¾­¸ü»»¹ýÎÒµÄÑ¡Ïʽ¹¤×÷Çø×é¼þ¹©Ó¦ÉÌ£¬Õâ´Î¸ü»»½ö½öÔÚÊÊÅäÆ÷ÀàÖÐÔì³ÉÁË×îµÍÏ޶ȵĸü¸Ä£¬¶ø ViewModel ºÍ Model Ôò³¹µ×²»ÊÜÓ°Ïì¡£

ÔÚ ViewModel ²ãÖд¦ÀíÎĵµµÄÄÜÁ¦¿´ÆðÀ´ºÜ¼òµ¥£¬¶øÊµÏÖ¸úÎÒµÄÑÝʾÏàËÆµÄ ViewModel ÃüÁîÒ²·Ç³£ÈÝÒס£ºÜÃ÷ÏÔ£¬ViewModel ÎĵµÀàÒ²·Ç³£ÊʺÏÌṩÓëÎĵµÏà¹ØµÄ ICommand ʵÀý¡£

View ¹Ò½Óµ½ÕâЩÃüÁîÖУ¬¶ø MVVM Éè¼ÆÄ£Ê½µÄÓŵãÒ²Ôڴ˹ý³ÌÖз¢»ÓµÃÁÜÀ쾡Ö¡£´ËÍ⣬Èç¹ûÄúÐèÒªÔÚÓû§´´½¨ÈκÎÎĵµÖ®Ç°ÏÔʾÊý¾Ý£¨¿ÉÄÜÊÇÔÚ¿ÉÕÛµþµÄ¹¤¾ß´°¿ÚÖУ©£¬ViewModel Îĵµ¹ÜÀíÆ÷·½·¨»¹ÄÜÓ뵥һʵÀý·½·¨ÅäºÏʹÓá£

×ܽá

MVVM Éè¼ÆÄ£Ê½ÊÇÒ»ÖÖÇ¿´ó¶øÊµÓõÄģʽ£¬µ«ÊÇûÓÐÈκÎÒ»ÖÖÉè¼ÆÄ£Ê½Äܹ»½â¾öËùÓÐÎÊÌâ¡£¾ÍÏñÎÒÔÚ±¾ÎÄËùÑÝʾµÄ£¬½« MVVM ģʽºÍÄ¿±êÓëÆäËûģʽ£¨ÀýÈçÊÊÅäÆ÷ºÍµ¥Ò»ÊµÀý£©½áºÏʹÓ㬼ÈÄÜÀûÓÃÐ嵀 .NET Framework 4 ¹¦ÄÜ£¨ÀýÈ綯̬µ÷¶È£©£¬ÓÖÄܽâ¾öʵÏÖ MVVM Éè¼ÆÄ£Ê½Ê±Óöµ½µÄÐí¶à³£¼ûÎÊÌâ¡£°´ÕÕÕâÖÖ·½Ê½Ê¹Óà MVVM£¬¿É´´Ôì³ö¸ü¼ÓÓÅÃÀ¡¢¸üÈÝÒ×ά»¤µÄ WPF ºÍ Silverlight Ó¦ÓóÌÐò¡£ÓÐ¹Ø MVVM µÄ¸ü¶àÐÅÏ¢£¬Çë²Î¼û MSDN ÔÓÖ¾£¨2009 Äê 2 Ô£©Öп¯ÔØµÄ Josh Smith µÄÎÄÕ¡£

ÓÉÓÚ GetCustomAttributes ·½·¨ÒѾ­»ñµÃÁË·´ÉäµÄÊôÐÔÐÅÏ¢£¬Òò´ËËü¿ÉÒÔ·µ»ØÄ£ÐÍÊôÐÔÉϵÄÈκΠAffectsOtherProperty ÌØÐÔ¡£È»ºó£¬¸Ã´úÂëÑ­»·±éÀúÕâÐ©ÌØÐÔ£¬²¢ÎªÃ¿¸öÌØÐÔÒý·¢ÊôÐÔ¸ü¸Äʼþ¡£Òò´Ëͨ¹ý ViewModel ¶Ô BirthDate ÊôÐÔÖ´Ðеĸü¸Ä£¬ÏÖÔÚ»á×Ô¶¯Í¬Ê±Îª BirthDate ºÍ Age ÊôÐÔÒý·¢ÊôÐÔ¸ü¸Äʼþ¡£Òò´Ë£¬ViewModel ÈÔÈ»¿ÉÒÔÌṩÊÓͼËùÐèµÄÃüÁîºÍ¸ü¶àÊôÐÔ£¬¶øÎÞÐèÖØ¸´ Model ÊôÐÔ»ò´´½¨´óÁ¿´úÀíÊôÐÔ¡£ÕâÖÖ·½·¨µ±È»ÓÐÆäÎüÒýÁ¦£¬ÓÈÆäÊÇÔÚ Model ÀàÒѾ­ÊµÏÖÁË INotifyPropertyChanged ½Ó¿ÚµÄÇé¿öÏ¡£ÈÃÄ£ÐÍʵÏִ˽ӿڲ¢²»Ò»¶¨ÊÇ»µÊ£¬ËüÉõÖÁÊÇ Microsoft .NET Framework 2.0 ºÍ Windows ´°ÌåÓ¦ÓóÌÐòÖг£¼ûµÄ×ö·¨¡£¾¡¹ÜËü»áʹÓòÄ£ÐͱäµÃºÜÉ¢ÂÒ£¬µ«È·Êµ¶Ô ASP.NET Ó¦ÓóÌÐò»òÓò·þÎñºÜÓÐÓá£

 

   
2979 ´Îä¯ÀÀ       27
 
Ïà¹ØÎÄÕÂ

Éî¶È½âÎö£ºÇåÀíÀôúÂë
ÈçºÎ±àд³öÓµ±§±ä»¯µÄ´úÂë
ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
ÍŶÓÏîÄ¿¿ª·¢"±àÂë¹æ·¶"ϵÁÐÎÄÕÂ
 
Ïà¹ØÎĵµ

ÖØ¹¹-¸ÄÉÆ¼ÈÓдúÂëµÄÉè¼Æ
Èí¼þÖØ¹¹v2
´úÂëÕû½àÖ®µÀ
¸ßÖÊÁ¿±à³Ì¹æ·¶
 
Ïà¹Ø¿Î³Ì

»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì