ç®æ¬¡
- ã¯ããã«
- Prismã¢ããªã±ãŒã·ã§ã³ã®åæå
- ã³ã³ããŒãã³ãéã®äŸåé¢ä¿ã®ç®¡ç
- ã¢ãžã¥ã©ãŒã¢ããªã±ãŒã·ã§ã³éçº
- MVVMãã¿ãŒã³ã®å®è£
- é«åºŠãªMVVMã·ããªãª
- ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã®äœæ
- ããã²ãŒã·ã§ã³
- ççµåã³ã³ããŒãã³ãéã®çžäºäœçš
Model-View-ViewModel ïŒMVVMã View-View-View- ModelïŒãã¿ãŒã³ã¯ããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ããããžãã¹ããžãã¯ãšãã¬ãŒã³ããŒã·ã§ã³ããžãã¯ãåé¢ããã®ã«åœ¹ç«ã¡ãŸãã ã¢ããªã±ãŒã·ã§ã³ããžãã¯ãšUIã®éã§è²¬ä»»ãå ±æããããã®ãµããŒãã«ãããã¢ããªã±ãŒã·ã§ã³ã®ãã¹ããä¿å®ãéçºã容æã«ãªããŸãã ãŸããã³ãŒãã®åå©çšæ©èœãå€§å¹ ã«åäžãããéçºè ãšèšèšè ãã¢ããªã±ãŒã·ã§ã³ã®é¢é£éšåã®éçºã§ããç°¡åã«å ±åäœæ¥ã§ããããã«ããŸãã
MVVMãã¿ãŒã³ã䜿çšãããšãã¢ããªã±ãŒã·ã§ã³ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ããã¬ãŒã³ããŒã·ã§ã³ããžãã¯ãããã³ããžãã¹ããžãã¯ã3ã€ã®åå¥ã®ã¯ã©ã¹ã«åå²ãããŸãã ããã¯ãUIãšãã®ããžãã¯ãã«ãã»ã«åãããã¥ãŒããã¬ãŒã³ããŒã·ã§ã³ããžãã¯ãšãã®ç¶æ ãã«ãã»ã«åãããã¥ãŒã¢ãã«ãããã³ã¢ããªã±ãŒã·ã§ã³ã®ããžãã¹ããžãã¯ãšããŒã¿ãã«ãã»ã«åããã¢ãã«ã§ãã
Prismã«ã¯ãSilverlightãŸãã¯WPFã¢ããªã±ãŒã·ã§ã³ã§MVVMãã¿ãŒã³ãå®è£ ããæ¹æ³ã瀺ããµã³ãã«ããã³å®è£ äŸãå«ãŸããŠããŸãã Prismã©ã€ãã©ãªã¯ããã®ãã¿ãŒã³ã®å®è£ ã«åœ¹ç«ã€æ©èœãæäŸããŸãã ãããã®æ©èœã¯ãMVVMãã¿ãŒã³ãå®è£ ããããã®æãäžè¬çãªæ¹æ³ãå ·äœåããExpression Blendããã³Visual Studioãšã®ãã¹ã容ææ§ããã³äºææ§ãæäŸããããã«èšèšãããŠããŸãã
ãã®ç« ã§ã¯ãMVVMãã¿ãŒã³ã®æŠèŠãšãã®å®è£ æ¹æ³ã«ã€ããŠèª¬æããŸãã 第6ç« ã§ã¯ãPrismã©ã€ãã©ãªã䜿çšããŠããè€éãªMVVMã¹ã¯ãªãããå®è£ ããæ¹æ³ã«ã€ããŠèª¬æããŸãã
責任ãšã¯ã©ã¹ã®ç¹åŸŽ
MVVMãã¿ãŒã³ã¯ã ãã¬ãŒã³ããŒã·ã§ã³ã¢ãã«ãã¿ãŒã³ã®å¯æ¥ãªããªãšãŒã·ã§ã³ã§ãããããŒã¿ãã€ã³ãã£ã³ã°ãããŒã¿ãã¿ãŒã³ãã³ãã³ããåäœãªã©ã®åºæ¬çãªWPFããã³Silverlightæ©èœãšã®æŽåæ§ãé«ããããã«æé©åãããŠããŸãã
MVVMãã¿ãŒã³ã§ã¯ããã¥ãŒã¯UIãšUIããžãã¯ãã«ãã»ã«åãããã¥ãŒã¢ãã«ã¯ãã¬ãŒã³ããŒã·ã§ã³ããžãã¯ãšãã®ç¶æ ãã«ãã»ã«åããã¢ãã«ã¯ããžãã¹ããžãã¯ãšããŒã¿ãã«ãã»ã«åããŸãã ãã¥ãŒã¯ãããŒã¿ãã³ãã³ããããã³éç¥ã€ãã³ãããã€ã³ãããããšã«ããããã¥ãŒã¢ãã«ãšå¯Ÿè©±ããŸãã ãã¬ãŒã³ããŒã·ã§ã³ã¢ãã«ã¯ãã¢ãã«ã«ããŒã¿ãèŠæ±ããããå€æŽã®éç¥ããµãã¹ã¯ã©ã€ãããã¢ãã«ã®ç¶æ ã®æŽæ°ã調æŽããå¿ èŠã«å¿ããŠããŒã¿ãå€æãæ€èšŒãéèšããŠãã¥ãŒã«è¡šç€ºããŸãã
次ã®å³ã¯ãMVVMãã¿ãŒã³ã®3ã€ã®éšåãšãããã®çžäºäœçšã瀺ããŠããŸãã

ãã¹ãŠã®å ±æãã¬ãŒã³ããŒã·ã§ã³ãã¿ãŒã³ãšåæ§ã«ãMVVMãã¿ãŒã³ãå¹ççã«äœ¿çšããããã®éµã¯ãã¢ããªã±ãŒã·ã§ã³ã³ãŒããæ£ããã¯ã©ã¹ã«åå²ããæ¹æ³ãç解ãããããã®ã¯ã©ã¹ãç°ãªãã·ããªãªã§çžäºäœçšããæ¹æ³ãç解ããããšã§ãã 以äžã®ã»ã¯ã·ã§ã³ã§ã¯ãMVVMãã¿ãŒã³ã®åã¯ã©ã¹ã®è²¬ä»»ãšç¹æ§ã«ã€ããŠèª¬æããŸãã
ã¯ã©ã¹ãèŠã
ãã¥ãŒã¯ããŠãŒã¶ãŒãç»é¢ã«è¡šç€ºãããã®ã決å®ãã圹å²ãæãããŸãã çæ³çã«ã¯ãåé¢ã³ãŒããã¥ãŒã«ã¯ã
InitializeComponent
ã¡ãœãããåŒã³åºãã³ã³ã¹ãã©ã¯ã¿ãŒã®ã¿ãå«ãŸããŠããŸãã å Žåã«ãã£ãŠã¯ãåé¢ã³ãŒãã«ã¯ãè€éãªã¢ãã¡ãŒã·ã§ã³ãªã©ãXAMLã§è¡šçŸããããšãå°é£ãŸãã¯éå¹ççãªèŠèŠçåäœãå®è£ ããUIããžãã¯ã³ãŒããå«ãŸããŠããå ŽåããããŸãããŸãããã¥ãŒã®äžéšã§ããèŠèŠèŠçŽ ãã³ãŒãã§çŽæ¥å¶åŸ¡ããå¿ èŠãããå ŽåããããŸãã ãã¥ãŒã«ãã¹ããå¿ èŠãªããžãã¯ã³ãŒããé 眮ããããšã¯èš±å¯ãããŸããã éåžžãã³ãŒãããã€ã³ããã¥ãŒã®ã³ãŒãã¯ãUIãªãŒãã¡ãŒã·ã§ã³ã䜿çšããŠãã¹ãã§ããŸãã
Silverlightããã³WPFã§ã¯ããã¥ãŒå ã®ããŒã¿ãã€ã³ãã£ã³ã°åŒã¯ããã®ããŒã¿ã³ã³ããã¹ãã«é¢é£ããŠè©äŸ¡ãããŸãã MVVMã§ã¯ããã¬ãŒã³ããŒã·ã§ã³ã¢ãã«ã¯ãã¬ãŒã³ããŒã·ã§ã³ããŒã¿ã®ã³ã³ããã¹ããšããŠèšå®ãããŸãã ãã¥ãŒã¢ãã«ã¯ããã¥ãŒããã€ã³ãã§ããããããã£ãšã³ãã³ããå®è£ ããå€æŽéç¥ã€ãã³ããéããŠç¶æ ã®å€åããã¥ãŒã«éç¥ããŸãã éåžžããã¥ãŒãšãã®ãã¬ãŒã³ããŒã·ã§ã³ã¢ãã«ã®éã«ã¯çŽæ¥çãªé¢ä¿ããããŸãã
éåžžããã¥ãŒã¯
Control
ã¯ã©ã¹ãŸãã¯
UserControl
ã¯ã©ã¹ããç¶æ¿ãããŸãã ãã ããå Žåã«ãã£ãŠã¯ããã¬ãŒã³ããŒã·ã§ã³ã¯ããªããžã§ã¯ããèŠèŠçã«è¡šãããã«äœ¿çšãããUIèŠçŽ ãå®çŸ©ããããŒã¿ãã³ãã¬ãŒãã«ãã£ãŠè¡šãããå ŽåããããŸãã éçºè ã¯ããŒã¿ãã³ãã¬ãŒãã䜿çšããŠããã¬ãŒã³ããŒã·ã§ã³ã¢ãã«ã®èŠèŠåæ¹æ³ãç°¡åã«æå®ããããåºã«ãªããªããžã§ã¯ãããã®åäœãçŽæ¥å€æŽããã«ããã©ã«ãã®èŠèŠè¡šçŸãå€æŽãããã§ããŸãã
ããŒã¿ãã³ãã¬ãŒãã¯ãã³ãŒãããã€ã³ãã®ãªããã¥ãŒãšèŠãªãããšãã§ããŸãã UIã«ãããããå¿ èŠããããšãã«ãç¹å®ã®çš®é¡ã®ãã¬ãŒã³ããŒã·ã§ã³ã¢ãã«ã«ãã€ã³ãããããã«èšèšãããŠããŸãã å®è¡æã«ããã³ãã¬ãŒãã«ãã£ãŠå®çŸ©ããããã¥ãŒãèªåçã«äœæããã察å¿ãããã¥ãŒã¢ãã«ããã®ããŒã¿ã³ã³ããã¹ãã«ãã£ãŠèšå®ãããŸãã
WPFã§ã¯ãããŒã¿ãã³ãã¬ãŒããã¢ããªã±ãŒã·ã§ã³ã¬ãã«ã®ãã¥ãŒã¢ãã«ã«é¢é£ä»ããããšãã§ããŸãã 次ã«ãWPFã¯ãUIã«è¡šç€ºããããã³ã«ãæå®ãããã¿ã€ãã®ãã¬ãŒã³ããŒã·ã§ã³ã¢ãã«ã®ãªããžã§ã¯ãã«ãã®ããŒã¿ãã³ãã¬ãŒããèªåçã«é©çšããŸãã ããã¯ãæé»çãªããŒã¿ãã¿ãŒã³ãšããŠç¥ãããŠããŸãã Silverlightã§ã¯ã衚瀺ããã³ã³ãããŒã«å ã®ãã¥ãŒã¢ãã«ãªããžã§ã¯ãã®ããŒã¿ãã³ãã¬ãŒããæ瀺çã«å®çŸ©ããå¿ èŠããããŸãã ããŒã¿ãã³ãã¬ãŒãã¯ãããã䜿çšããã³ã³ãããŒã«ã«çµã¿èŸŒãŸããŠãããã®ãšããŠå®çŸ©ãããã芪ãã¥ãŒã®å€éšã®ãªãœãŒã¹ãã£ã¯ã·ã§ããªã§å®çŸ©ãããã¬ãŒã³ããŒã·ã§ã³ãªãœãŒã¹ãã£ã¯ã·ã§ããªãšå®£èšçã«çµã¿åãããããšãã§ããŸãã
èŠçŽãããšããã¥ãŒã«ã¯æ¬¡ã®éèŠãªç¹æ§ããããŸãã
- ãã¥ãŒã¯ããŠã£ã³ããŠãããŒãžããŠãŒã¶ãŒã³ã³ãããŒã«ãããŒã¿ãã³ãã¬ãŒããªã©ã®èŠèŠèŠçŽ ã§ãã ãã¥ãŒã¯ãã³ã³ãããŒã«ããã®ã¬ã€ã¢ãŠããããã³ã¹ã¿ã€ã«ãå®çŸ©ããŸãã
- ãã¥ãŒã¯ã
DataContext
ããããã£ãä»ããŠãã¥ãŒã¢ãã«ãåç §ããŸãã ãã¥ãŒå ã®ã³ã³ãããŒã«ã¯ããã¥ãŒã¢ãã«ã®ããããã£ãšã³ãã³ãã«é¢é£ä»ããããŠããŸãã - ãã¥ãŒã¯ããã¥ãŒãšãã¥ãŒã¢ãã«ã®éã®ããŒã¿ãã€ã³ãã£ã³ã°åäœãã«ã¹ã¿ãã€ãºã§ããŸãã ããšãã°ããã¥ãŒã¯å€ã³ã³ããŒã¿ãŒã䜿çšããŠUIã«è¡šç€ºãããããŒã¿ããã©ãŒãããããããæ€èšŒèŠåã䜿çšããŠãŠãŒã¶ãŒå ¥åã®è¿œå æ€èšŒãæäŸãããã§ããŸãã
- ãã¥ãŒã¯ãã¢ãã¡ãŒã·ã§ã³ãé·ç§»ãªã©ã®UIã®èŠèŠçãªåäœãå®çŸ©ããã³åŠçããŸããããã¯ããã¥ãŒã¢ãã«ã®ç¶æ ã®å€åã«ãã£ãŠããŸãã¯UIãšã®ãŠãŒã¶ãŒã€ã³ã¿ã©ã¯ã·ã§ã³ã«ãã£ãŠããªã¬ãŒã§ããŸãã
- ã³ãŒãããã€ã³ããã¥ãŒã¯ãXAMLã§è¡šçŸããã®ãé£ããããŸãã¯ãã¥ãŒã§å®çŸ©ãããç¹å®ã®UIã³ã³ãããŒã«ãžã®çŽæ¥åç §ãå¿ èŠãšããèŠèŠçãªåäœãå®è£ ããUIããžãã¯ãå®çŸ©ã§ããŸãã
ã¢ãã«ã¯ã©ã¹ã衚瀺
MVVMãã¿ãŒã³ã®ãã¬ãŒã³ããŒã·ã§ã³ã¢ãã«ã¯ããã¬ãŒã³ããŒã·ã§ã³ããžãã¯ãšè¡šç€ºçšã®ããŒã¿ãã«ãã»ã«åããŸãã 圌女ã¯ããã¬ãŒã³ããŒã·ã§ã³ãžã®çŽæ¥çãªãªã³ã¯ããŸãã¯å®è£ ãŸãã¯ãã¬ãŒã³ããŒã·ã§ã³ã®çš®é¡ã«é¢ããç¥èãæã¡ãŸããã ãã¥ãŒã¢ãã«ã¯ããã¥ãŒãããŒã¿ããã€ã³ãã§ããããããã£ãšã³ãã³ããå®è£ ããéç¥ã€ãã³ããéããŠç¶æ ã®å€åããã¥ãŒã«éç¥ããŸãã ãã¥ãŒã¢ãã«ãæäŸããããããã£ãšã³ãã³ãã¯ãUIãäŸåããæ©èœã決å®ããŸããããã¥ãŒã¯ãã®æ©èœããŠãŒã¶ãŒã«ã©ã®ããã«è¡šç€ºããããã決å®ããŸãã
ãã¥ãŒã¢ãã«ã¯ããã¥ãŒãšå¿ èŠãªã¢ãã«ã¯ã©ã¹ãšã®çžäºäœçšã調æŽããŸãã å€ãã®å Žåããã¬ãŒã³ããŒã·ã§ã³ã¢ãã«ãšã¢ãã«ã¯ã©ã¹ã®éã«ã¯1察å€ã®é¢ä¿ããããŸãã ãã¥ãŒã¢ãã«ã¯ããã¥ãŒå ã®ã³ã³ãããŒã«ãããŒã¿ãã¢ãã«ã«çŽæ¥ãã€ã³ãã§ããããã«ãã¢ãã«ã¯ã©ã¹ããã¥ãŒã«çŽæ¥çœ®ãæããããšãã§ããŸãã ãã®å Žåãã¢ãã«ã¯ã©ã¹ã¯ãããŒã¿ãã€ã³ãã£ã³ã°ããã³é¢é£ããå€æŽéç¥ã€ãã³ãããµããŒãããããã«èšèšããå¿ èŠããããŸãã ãã®ã·ããªãªã®è©³çŽ°ã«ã€ããŠã¯ããã®ãããã¯ã®ãããŒã¿ãã€ã³ãã£ã³ã°ãã»ã¯ã·ã§ã³ãåç §ããŠãã ããã
ãã¥ãŒã¢ãã«ã§ã¯ãã¢ãã«ããŒã¿ãç°¡åã«äœ¿çšã§ããããã«ãã¢ãã«ããŒã¿ãå€æãŸãã¯æäœã§ããŸãã ãã¥ãŒã¢ãã«ã«ã¯ããã¥ãŒã®ç¹å®ã®ããŒãºã«åãããŠè¿œå ã®ããããã£ããããŸãã ãããã®ããããã£ã¯éåžžãã¢ãã«ã®äžéšã«ããããšã¯ã§ããŸããã ããšãã°ããã¥ãŒã¢ãã«ã¯2ã€ã®ãã£ãŒã«ãã®å€ãçµã¿åãããŠè¡šç€ºããããããããæååã®é·ããå¶éãããŠãããã£ãŒã«ãã«å ¥åãããšãã«æ®ã£ãŠããæåæ°ãèšç®ãããã§ããŸãã ãã¥ãŒã¢ãã«ã¯ãããŒã¿æ€èšŒããžãã¯ãå®è£ ããŠäžè²«æ§ã確ä¿ããããšãã§ããŸãã
ãã¥ãŒã¢ãã«ã¯ãUIã®èŠèŠçãªå€æŽã«ãã¥ãŒã䜿çšã§ããè«çç¶æ ã決å®ã§ããŸãã ãã¥ãŒã¯ããã¥ãŒã¢ãã«ã®ç¶æ ãåæ ããããŒã¯ã¢ãããŸãã¯ã¹ã¿ã€ã«ã®å€æŽãå®çŸ©ã§ããŸãã ããšãã°ããã¥ãŒã¢ãã«ã«ã¯ãããŒã¿ãéåæçã«WebãµãŒãã¹ã«éä¿¡ãããããšã瀺ãç¶æ ããããŸãã ãã®ç¶æ ã§ã¯ããã¥ãŒã«ã¢ãã¡ãŒã·ã§ã³ã衚瀺ããããŠãŒã¶ãŒã«èŠèŠçãªãã£ãŒãããã¯ãæäŸãããŸãã
éåžžããã¬ãŒã³ããŒã·ã§ã³ã¢ãã«ã¯ãUIã§è¡šããããŠãŒã¶ãŒãåŒã³åºãããšãã§ããã³ãã³ããŸãã¯ã¢ã¯ã·ã§ã³ãå®çŸ©ããŸãã å žåçãªäŸã¯ããŠãŒã¶ãŒãWebãµãŒãã¹ãŸãã¯ãªããžããªã«ããŒã¿ãæž¡ãããšãã§ãã
Submit
ã³ãã³ãããã¥ãŒã¢ãã«ãæäŸããå Žåã§ãã ãã¥ãŒã¯ãã®ã³ãã³ãããã¿ã³ãšããŠè¡šç€ºã§ããããããŠãŒã¶ãŒã¯ãã®ã³ãã³ããã¯ãªãã¯ããŠããŒã¿ã転éã§ããŸãã éåžžãã³ãã³ãã䜿çšã§ããªããªããšãUIã«é¢é£ä»ããããè¡šçŸãç¡å¹ã«ãªããŸãã ã³ãã³ãã䜿çšãããšããŠãŒã¶ãŒã¢ã¯ã·ã§ã³ãã«ãã»ã«åããèŠèŠçãªãã¬ãŒã³ããŒã·ã§ã³ããåé¢ã§ããŸãã
ãã®çµæããã¬ãŒã³ããŒã·ã§ã³ã¢ãã«ã«ã¯æ¬¡ã®éèŠãªç¹åŸŽããããŸãã
- ããã¯ããžã¥ã¢ã«ã¯ã©ã¹ã§ã¯ãªããWPFãŸãã¯Silverlightã®åºæ¬ã¯ã©ã¹ãç¶æ¿ããŸããã ããã¯ãã¢ããªã±ãŒã·ã§ã³ã§ã®ãŠãŒã¶ãŒã¢ã¯ã·ã§ã³ããµããŒãããããã«å¿ èŠãªãã¬ãŒã³ããŒã·ã§ã³ããžãã¯ãã«ãã»ã«åããŸãã ãã¬ãŒã³ããŒã·ã§ã³ã¢ãã«ã¯ããã¬ãŒã³ããŒã·ã§ã³ããã³ã¢ãã«ãšã¯ç¬ç«ããŠãã¹ããããŸãã
- éåžžããã¥ãŒãçŽæ¥åç
§ããŸããã ãã¥ãŒãããŒã¿ããã€ã³ãã§ããããããã£ãšã³ãã³ããå®è£
ããŸãã
INotifyPropertyChanged
ããã³INotifyCollectionChanged
éç¥ã€ãã³ããéããŠãç¶æ ã®å€åããã¥ãŒã«éç¥ãINotifyCollectionChanged
ã - ãã¥ãŒãšã¢ãã«ã®çžäºäœçšã調æŽããŸãã ãã¥ãŒã§ç°¡åã«äœ¿çšã§ããããã«ããŒã¿ãå€æãŸãã¯æäœã§ããŸãããŸããã¢ãã«ã«ã¯ååšããªãè¿œå ã®ããããã£ãå®è£
ã§ããŸãã
IDataErrorInfo
ãŸãã¯INotifyDataErrorInfo
ä»ããŠããŒã¿æ€èšŒãå®è£ ããããšãã§ãINotifyDataErrorInfo
ã - ãã¥ãŒããŠãŒã¶ãŒã«èŠèŠçã«æ瀺ã§ããè«çç¶æ ãèå¥ã§ããŸãã
ã泚æ ãã¬ãŒã³ããŒã·ã§ã³ãŸãã¯ãã¬ãŒã³ããŒã·ã§ã³ã¢ãã«ïŒ
å€ãã®å Žåãç¹å®ã®æ©èœãå®è£ ããå Žæã決å®ããããšã¯æããã§ã¯ãããŸããã äžè¬çãªã«ãŒã«ã§ã¯ãç¹å®ã®ããžã¥ã¢ã«ãã£ã¹ãã¬ã€ã«é¢é£ããåŸã§ã¢ããã°ã¬ãŒãã§ãããã®ã¯ãã¹ãŠïŒçŸåšãã¢ããã°ã¬ãŒããèšç»ããŠããªãå Žåã§ãïŒãã¥ãŒã«å ¥ããå¿ èŠããããŸãã ã¢ããªã±ãŒã·ã§ã³ããžãã¯ã«ãšã£ãŠéèŠãªãã®ã¯ãã¹ãŠããã¥ãŒã¢ãã«ã«å ¥ãå¿ èŠããããŸãã ããã«ããã¥ãŒã¢ãã«ã«ã¯ãã¥ãŒå ã®ç¹å®ã®èŠèŠèŠçŽ ã«é¢ããæ瀺çãªç¥èããªãããããã¥ãŒå ã®èŠèŠèŠçŽ ãããã°ã©ã ã§å¶åŸ¡ããããã®ã³ãŒãã¯ããã¥ãŒã®ã³ãŒãããã€ã³ãã«ãããã Behaviorsã«ã«ãã»ã«åãããŠããå¿ èŠããããŸãã åæ§ã«ãããŒã¿ãã€ã³ãã£ã³ã°ã«ãã£ãŠãã¥ãŒã«è¡šç€ºããå¿ èŠã®ããããŒã¿èŠçŽ ãååŸãŸãã¯æäœããããã®ã³ãŒãã¯ããã¥ãŒã¢ãã«ã«ååšããå¿ èŠããããŸãã ããšãã°ããªã¹ãããã¯ã¹ã§éžæããã¢ã€ãã ã®ãã€ã©ã€ãè²ã¯ãã¥ãŒã§å®çŸ©ããå¿ èŠããããŸããã衚瀺ããã¢ã€ãã ã®ãªã¹ããšéžæããã¢ã€ãã ãžã®ãªã³ã¯ã¯ãã¬ãŒã³ããŒã·ã§ã³ã¢ãã«ã§å®çŸ©ããå¿ èŠããããŸãã
ã¢ãã«ã¯ã©ã¹
MVVMãã¿ãŒã³ã®ã¢ãã«ã¯ãããžãã¹ããžãã¯ãšããŒã¿ãã«ãã»ã«åããŸãã ããžãã¹ããžãã¯ã¯ãããŒã¿ã®äžè²«æ§ãšæå¹æ§ã確ä¿ããããã«ããžãã¹ã«ãŒã«ãæºããããŠããããšã確èªããããã«ãã¢ããªã±ãŒã·ã§ã³ããŒã¿ã®ååŸãšç®¡çã«é¢ä¿ããã¢ããªã±ãŒã·ã§ã³ããžãã¯ãšããŠå®çŸ©ãããŸãã åå©çšæ§ãæ倧ã«ããããã«ãã¢ãã«ã«ã¯ãã¬ãŒã³ããŒã·ã§ã³åºæã®æ å ±ãããžãã¯ããŸãã¯åäœãå«ããªãã§ãã ããã
ååãšããŠãã¢ãã«ã¯ã¢ããªã±ãŒã·ã§ã³ã®ã¯ã©ã€ã¢ã³ãéšåã®ãµããžã§ã¯ãé åã®æ¬è³ªãè¡šããŸãã ã¢ããªã±ãŒã·ã§ã³ããŒã¿ã¢ãã«ãšãããžãã¹ããã³æ€èšŒããžãã¯ã«åºã¥ãããŒã¿æ§é ãå«ããããšãã§ããŸãã ã¢ãã«ã¯ããŒã¿ãšãã£ãã·ã¥ã«ãã¢ã¯ã»ã¹ã§ããŸãããããã¯éåžžãåå¥ã®ããŒã¿ãªããžããªãŸãã¯å¯Ÿå¿ãããµãŒãã¹ã䜿çšããŠè¡ãããŸãã å€ãã®å Žåãã¢ãã«ããã³ããŒã¿ã¢ã¯ã»ã¹å±€ã¯ãADO.NET Entity FrameworkãWCF Data ServicesããŸãã¯WCF RIA Servicesã€ã³ãã©ã¹ãã©ã¯ãã£ã®äžéšãšããŠèªåçã«çæãããŸãã
éåžžãã¢ãã«ã«ã¯ããã¥ãŒãžã®ãã€ã³ãã容æã«ããããŒã«ãå®è£ ãããŠããŸãã ããã¯éåžžãããããã£ãŸãã¯ã³ã¬ã¯ã·ã§ã³ãžã®å€æŽã®éç¥ã
INotifyPropertyChanged
ããã³
INotifyCollectionChanged
ä»ããŠãµããŒããããããšãæå³ã
INotifyCollectionChanged
ã ãªããžã§ã¯ãã®ã»ãããæäŸããã¢ãã«ã¯ã©ã¹ã¯ãéåžžã
INotifyCollectionChanged
ã€ã³ã¿ãŒãã§ã€ã¹ã®å®è£ ãæäŸãã
ObservableCollection<T>
ã¯ã©ã¹ããç¶æ¿ãããŸãã ã¢ãã«ã¯ã
IDataErrorInfo
ïŒãŸãã¯
INotifyDataErrorInfo
ïŒã€ã³ã¿ãŒãã§ã€ã¹ãä»ããããŒã¿æ€èšŒãšãšã©ãŒã¬ããŒãããµããŒãã§ããŸãã ãããã®ã€ã³ã¿ãŒãã§ã€ã¹ã«ããããã€ã³ããããããŒã¿ã®å€ãå€æŽããããšãã«ãWPFããã³Silverlightéç¥ãéä¿¡ããŠUIãæŽæ°ã§ããŸãã ãŸããUIã¬ãã«ã§ã®ããŒã¿æ€èšŒãµããŒããšãšã©ãŒã¬ããŒããæäŸããŸãã
ã泚æ
, ?
ã€ã³ã¿ãŒãã§ã€ã¹INotifyPropertyChanged
ãINotifyCollectionChanged
ãIDataErrorInfo
ããŸãã¯INotifyDataErrorInfo
å®è£ ããªãã¢ãã«ãªããžã§ã¯ãã䜿çšããå¿ èŠãããå ŽåããããŸãã ãããã®å Žåããã¥ãŒã¢ãã«ã¯ã¢ãã«ãªããžã§ã¯ããã©ãããããã¥ãŒã«å¿ èŠãªããããã£ãæäŸããå¿ èŠããããŸãã ãããã®ããããã£ã®å€ã¯ãã¢ãã«ãªããžã§ã¯ãã«ãã£ãŠçŽæ¥æäŸãããŸãã ãã¥ãŒã¢ãã«ã¯ããã¥ãŒãããŒã¿ãç°¡åã«ãã€ã³ãã§ããããã«ãæäŸããããããã£ã«å¿ èŠãªã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ã§ããŸãã
ãã®ã¢ãã«ã«ã¯ã次ã®äž»èŠãªæ©èœããããŸãã
- ã¢ãã«ã¯ã©ã¹ã¯ãã¢ããªã±ãŒã·ã§ã³ããŒã¿ãšããžãã¹ããžãã¯ãã«ãã»ã«åããããžã¥ã¢ã«ã¯ã©ã¹ã§ã¯ãããŸããã 圌ãã¯ãå¿ èŠãªããžãã¹ã«ãŒã«ãšããŒã¿æ€èšŒããžãã¯ãã«ãã»ã«åããããšã«ãããã¢ããªã±ãŒã·ã§ã³ããŒã¿ã管çãããã®äžè²«æ§ãšæå¹æ§ãä¿èšŒãã責任ããããŸãã
- ã¢ãã«ã¯ã©ã¹ã¯ããã¬ãŒã³ããŒã·ã§ã³ã¯ã©ã¹ãŸãã¯ãã¬ãŒã³ããŒã·ã§ã³ã¢ãã«ãçŽæ¥åç §ããããããã®ã¯ã©ã¹ã®å®è£ æ¹æ³ã«äŸåããŸããã
- ã¢ãã«ã¯ã©ã¹ã¯éåžžãããããã£ãŸãã¯ã³ã¬ã¯ã·ã§ã³ãžã®å€æŽã®éç¥ã
INotifyPropertyChanged
ããã³INotifyCollectionChanged
ä»ããŠINotifyCollectionChanged
ã ããã«ããããã¬ãŒã³ããŒã·ã§ã³ã«ç°¡åã«æ·»ä»ã§ããŸãã ãªããžã§ã¯ãã®ã³ã¬ã¯ã·ã§ã³ãè¡šãã¢ãã«ã¯ã©ã¹ã¯ãéåžžObservableCollection<T>.
ã¯ã©ã¹ããç¶æ¿ããObservableCollection<T>.
- ã¢ãã«ã¯ã©ã¹ã¯éåžžã
IDataErrorInfo
ãŸãã¯INotifyDataErrorInfo
ä»ããŠããŒã¿æ€èšŒãšãšã©ãŒã¬ããŒããæäŸãINotifyDataErrorInfo
ã - ã¢ãã«ã¯ã©ã¹ã¯éåžžãããŒã¿ã¢ã¯ã»ã¹ãšãã£ãã·ã¥ãã«ãã»ã«åãããµãŒãã¹ãŸãã¯ãªããžããªã§äœ¿çšãããŸãã
ã¯ã©ã¹ã®çžäºäœçš
MVVMãã¿ãŒã³ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ããã¬ãŒã³ããŒã·ã§ã³ããžãã¯ãããžãã¹ããžãã¯ãšããŒã¿ã®éã§è²¬ä»»ãæ確ã«åé¢ããåèŠçŽ ãåå¥ã®ã¯ã©ã¹ã«åå²ããŸãã ãããã£ãŠãMVVMãå®è£ ããå Žåãåã®ã»ã¯ã·ã§ã³ã§èª¬æããããã«ãã³ãŒããæ£ããã¯ã©ã¹ã«åå²ããããšãéèŠã§ãã
é©åã«èšèšããããã¬ãŒã³ããŒã·ã§ã³ã¯ã©ã¹ããã¬ãŒã³ããŒã·ã§ã³ã¢ãã«ãããã³ã¢ãã«ã¯ãæ£ããããžãã¯ãšåäœãã«ãã»ã«åããã ãã§ãªããããŒã¿ãã€ã³ãã£ã³ã°ãã³ãã³ããããã³ããŒã¿æ€èšŒã€ã³ã¿ãŒãã§ã€ã¹ãéããŠç°¡åã«çžäºäœçšããããã«èšèšãããŸãã
ãã¬ãŒã³ããŒã·ã§ã³ãšãã®ãã¬ãŒã³ããŒã·ã§ã³ã¢ãã«ãšã®çžäºäœçšã¯ããããæãéèŠã§ãããã¢ãã«ã¯ã©ã¹ãšãã¬ãŒã³ããŒã·ã§ã³ã¢ãã«ãšã®çžäºäœçšãéèŠã§ãã 以äžã®ã»ã¯ã·ã§ã³ã§ã¯ããããã®çžäºäœçšã®ããŸããŸãªã¿ã€ãã«ã€ããŠèª¬æããMVVMãã¿ãŒã³ãå®è£ ããŠããããéçºããæ¹æ³ã«ã€ããŠèª¬æããŸãã
ããŒã¿ãã€ã³ãã£ã³ã°
ããŒã¿ãã€ã³ãã£ã³ã°ã¯ãMVVMãã¿ãŒã³ã§éåžžã«éèŠãªåœ¹å²ãæãããŸãã WPFããã³Silverlightã¯ã匷åãªããŒã¿ãã€ã³ãã£ã³ã°æ©èœãæäŸããŸãã ãã¬ãŒã³ããŒã·ã§ã³ã¢ãã«ãšïŒçæ³çã«ã¯ïŒã¢ãã«ã¯ã©ã¹ã¯ãããŒã¿ãã€ã³ãã£ã³ã°ããµããŒãããããã«èšèšããå¿ èŠããããŸãã éåžžãããã¯ãæ£ããã€ã³ã¿ãŒãã§ãŒã¹ãå®è£ ããå¿ èŠãããããšãæå³ããŸãã
Silverlightããã³WPFããŒã¿ãã€ã³ãã£ã³ã°ã¯ãããŸããŸãªã¢ãŒãããµããŒãããŠããŸãã äžæ¹åã®ããŒã¿ãã€ã³ãã£ã³ã°ã䜿çšãããšãUIã³ã³ãããŒã«ããã¥ãŒã¢ãã«ã«é¢é£ä»ããŠãã¬ã³ããªã³ã°æã«åºã«ãªãããŒã¿ã®å€ãåæ ãããããšãã§ããŸãã åæ¹åããŒã¿ãã€ã³ãã£ã³ã°ã¯ããŠãŒã¶ãŒãUIã§ããŒã¿ãå€æŽãããšãåºã«ãªãããŒã¿ãèªåçã«æŽæ°ããŸãã
ãã¬ãŒã³ããŒã·ã§ã³ã¢ãã«ã§ããŒã¿ãå€æŽããããšãã«UIãæŽæ°ãããããã«ããã«ã¯ãé©åãªå€æŽéç¥ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ããå¿ èŠããããŸãã ããŒã¿ããã€ã³ãã§ããããããã£ãå®çŸ©ããå Žåã¯ã
INotifyPropertyChanged
ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ããå¿ èŠããããŸãã ãã¥ãŒã¢ãã«ãã³ã¬ã¯ã·ã§ã³ãè¡šãå Žåã
INotifyCollectionChanged
ãå®è£ ãããããã®ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ãã
ObservableCollection<T>
ã¯ã©ã¹ããç¶æ¿ããå¿ èŠããããŸãã ãããã®ã€ã³ã¿ãŒãã§ãŒã¹ã¯äž¡æ¹ãšããåºç€ãšãªãããŒã¿ãå€æŽããããã³ã«çæãããã€ãã³ããå®çŸ©ããŸãã ãããã®ã€ãã³ããçæããããšãé¢é£ããã³ã³ãããŒã«ãèªåçã«æŽæ°ãããŸãã
å€ãã®å Žåããã¥ãŒã¢ãã«ã«ã¯ãªããžã§ã¯ããè¿ãããããã£ãå«ãŸããŠããŸãïŒãªããžã§ã¯ãã«ã¯ãè¿œå ã®ãªããžã§ã¯ããè¿ãããããã£ãå«ãŸããŠããå ŽåããããŸãïŒã ããŒã¿ãã€ã³ãã£ã³ã°WPFããã³Silverlightã¯ã
Path
ããããã£ãä»ãããã¹ããããããããã£ãžã®ãã€ã³ãã£ã³ã°ããµããŒãããŠããŸãã ãããã£ãŠããã¬ãŒã³ããŒã·ã§ã³ã¢ãã«ã¯ãä»ã®ã¯ã©ã¹ã®ãã¬ãŒã³ããŒã·ã§ã³ã¢ãã«ãŸãã¯ã¢ãã«ãžã®åç §ãè¿ãåŸåããããŸãã ãã¬ãŒã³ããŒã·ã§ã³ã«äœ¿çšã§ãããã¹ãŠã®ãã¬ãŒã³ããŒã·ã§ã³ã¢ãã«ã¯ã©ã¹ãšã¢ãã«ã¯ã
INotifyPropertyChanged
ãŸãã¯
INotifyCollectionChanged
å®è£ ããå¿ èŠããã
INotifyCollectionChanged
ã
以äžã®ã»ã¯ã·ã§ã³ã§ã¯ãMVVMãã¿ãŒã³å ã®ããŒã¿ãã€ã³ãã£ã³ã°ããµããŒãããããã«å¿ èŠãªã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ããæ¹æ³ã«ã€ããŠèª¬æããŸãã
INotifyPropertyChangedã®å®è£
ãã¥ãŒã¢ãã«ãŸãã¯ã¢ãã«ã®ã¯ã©ã¹ã«
INotifyPropertyChanged
ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ãããšãå€ãå€æŽããããšãã«ãã¥ãŒã®é¢é£ã³ã³ãããŒã«ã«éç¥ã§ããŸãã 次ã®äŸã«ç€ºãããã«ããã®ã€ã³ã¿ãŒãã§ã€ã¹ã®å®è£ ã¯æ¯èŒçåçŽã§ãïŒ Basic MVVM QuickStartã®
Questionnaire
ã¯ã©ã¹ãåç §ïŒã
public class Questionnaire : INotifyPropertyChanged { private string favoriteColor; public event PropertyChangedEventHandler PropertyChanged; ... public string FavoriteColor { get { return this.favoriteColor; } set { if (value != this.favoriteColor) { this.favoriteColor = value; if (this.PropertyChanged != null) { this.PropertyChanged(this, new PropertyChangedEventArgs("FavoriteColor")); } } } } }
ãã¥ãŒã¢ãã«ã®å€ãã®ã¯ã©ã¹ã§ã®
INotifyPropertyChanged
ã€ã³ã¿ãŒãã§ã€ã¹ã®å®è£ ã¯ãããããã£åãå®çŸ©ããå¿ èŠãããããã«ç¹°ãè¿ããããšã©ãŒãçºçãããããªããŸãã Prismã©ã€ãã©ãªã¯ã以äžã«ç€ºãããã«ã
INotifyPropertyChanged
ã»ãŒããªæ¹æ³ã§
INotifyPropertyChanged
ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ãããã¥ãŒã¢ãã«ã¯ã©ã¹ãç¶æ¿ã§ãã䟿å©ãªåºæ¬ã¯ã©ã¹ãæäŸããŸãã
public class NotificationObject : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; ... protected void RaisePropertyChanged<T>( Expression<Func<T>> propertyExpression) {...} protected virtual void RaisePropertyChanged(string propertyName) {...} }
ç¶æ¿ããããã¥ãŒã¢ãã«ã¯ã©ã¹ã¯ã以äžã«ç€ºãããã«ãç¹å®ã®ããããã£åã§
RaisePropertyChanged
ãåŒã³åºãããããããã£ã«ã¢ã¯ã»ã¹ããã©ã ãåŒã䜿çšããŠãããããã£å€æŽã€ãã³ããçæã§ããŸãã
public string CurrentState { get { return this.currentState; } set { if (this.currentState != value) { this.currentState = value; this.RaisePropertyChanged(() => this.CurrentState); } } }
ã泚æ
ãã®æ¹æ³ã§ã©ã ãåŒã䜿çšãããšãã¯ãšãªããšã«ã©ã ãåŒãè©äŸ¡ããå¿ èŠããããããããã©ãŒãã³ã¹ããããã«äœäžããŸãã , , . , , . , , .
ã泚æ
Resharper , .
å€ãã®å Žåãã¢ãã«ãŸãã¯ãã¥ãŒã¢ãã«ã«ã¯ãã¢ãã«ãŸãã¯ãã¥ãŒã¢ãã«ã®ä»ã®ããããã£ã«å¿ããŠå€ãèšç®ãããããããã£ãå«ãŸããŸããããããã£å€æŽã€ãã³ããçæãããšãã¯ãäŸåããããã£ã®éç¥ã€ãã³ããå¿ ãçæããŠãã ãããããªããæåã®2ã€ã®ãã£ãŒã«ãã®åèšãè¡šããã£ãŒã«ãPrice1ãPrice2ãšSumPriceãæã£ãŠããå Žåã«ã¯ããã£ãŒã«ãã®ã»ãã¿ãŒ
Price1
ãšã¯ã
Price2
äžèšã®ãã¹ãŠã®ã¡ãœãããšåŒã°ããã¹ãã§ã
RaisePropertyChanged(âSumPriceâ)
ã
INotifyCollectionChangedã®å®è£
ãã¥ãŒã¢ãã«ã®ã¯ã©ã¹ãŸãã¯ã¢ãã«ã¯ãèŠçŽ ã®ã³ã¬ã¯ã·ã§ã³ã«ããããšããã³ã¬ã¯ã·ã§ã³ãè¿ã1ã€ä»¥äžã®ããããã£ãæã€ããšãã§ããŸãããã以å€ã®å Žåã¯ãããããããŸãã¯
ItemsControl
ãªã©ã®çžç¶äººã®ããããã§ã³ã¬ã¯ã·ã§ã³ã衚瀺ããããšãã§ããŸãããããã®ã³ã³ãããŒã«ã¯ãããããã£ãä»ããŠã³ã¬ã¯ã·ã§ã³ãè¿ãã³ã¬ã¯ã·ã§ã³ãŸãã¯ããããã£ãæäŸãããã¥ãŒã¢ãã«ã«é¢é£ä»ããããšãã§ããŸãã
ListBox
DataGrid
ItemSource
<DataGrid ItemsSource="{Binding Path=LineItems}" />
ãªããžã§ã¯ãã®ã³ã¬ã¯ã·ã§ã³ãžã®å€æŽã«é¢ããéç¥èŠæ±ãé©åã«ãµããŒãããã«ã¯ããã¥ãŒã¢ãã«ã®ã¯ã©ã¹ãŸãã¯ã³ã¬ã¯ã·ã§ã³ã§ããã¢ãã«ã¯ãã€ã³ã¿ãŒãã§ã€ã¹ã
INotifyCollectionChanged
ïŒã€ã³ã¿ãŒãã§ã€ã¹ã«å ããŠ
INotifyPropertyChanged
ïŒå®è£ ããå¿ èŠããããŸãããã¥ãŒã¢ãã«ãŸãã¯ã¢ãã«ã®ã¯ã©ã¹ããã³ã¬ã¯ã·ã§ã³ãžã®åç §ãè¿ãããããã£ãå®çŸ©ããå Žåãè¿ãããã³ã¬ã¯ã·ã§ã³ã¯ã©ã¹ã¯interfaceãå®è£ ããå¿ èŠããããŸã
INotifyCollectionChanged
ã
ãã ãã
INotifyCollectionChanged
ã³ã¬ã¯ã·ã§ã³å ã§ã¢ã€ãã ãè¿œå ãåé€ã移åããŸãã¯å€æŽããããšãã«éç¥ãéä¿¡ããå¿ èŠããããããã€ã³ã¿ãŒãã§ã€ã¹ã®å®è£ ã¯ããªãè€éã§ããå€ãã®å Žåãã€ã³ã¿ãŒãã§ã€ã¹ãçŽæ¥å®è£ ãã代ããã«ãçŽæ¥äœ¿çšããããæ¢ã«å®è£ ãããŠããã³ã¬ã¯ã·ã§ã³ã¯ã©ã¹ããç¶æ¿ããæ¹ãç°¡åã§ããã¯ã©ã¹
ObservableCollection<T>
ãã®ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ããéåžžã¯åºæ¬ã¯ã©ã¹ãšããŠããŸãã¯èŠçŽ ã®ã³ã¬ã¯ã·ã§ã³ãè¡šãããããã£ã§äœ¿çšãããŸãã
ãã¥ãŒã«ããŒã¿ããã€ã³ãããã³ã¬ã¯ã·ã§ã³ãäœæããå¿ èŠããããã¢ã€ãã ã®ãŠãŒã¶ãŒéžæã远跡ããããã³ã¬ã¯ã·ã§ã³å ã®ã¢ã€ãã ã®ãã£ã«ã¿ãªã³ã°ã䞊ã¹æ¿ããã°ã«ãŒãåããµããŒãããå¿ èŠããªãå Žåã¯ãã€ã³ã¹ã¿ã³ã¹ãžã®åç §ãè¿ãããããã£ããã¥ãŒã¢ãã«ã«å®çŸ©ããã ã
ObservableCollection<T>
ã§ãã
public class OrderViewModel : INotifyPropertyChanged { public OrderViewModel(IOrderService orderService) { this.LineItems = new ObservableCollection<OrderLineItem>( orderService.GetLineItemList()); } public ObservableCollection<OrderLineItem> LineItems { get; private set; } }
ã³ã¬ã¯ã·ã§ã³ã¯ã©ã¹ãžã®åç §ãïŒããšãã°ãå®è£ ããŠããªãå¥ã®ã³ã³ããŒãã³ããŸãã¯ãµãŒãã¹ãã
INotifyCollectionChanged
ïŒ
ObservableCollection<T>
ååŸãã
IEnumerable<T>
å Žåãã©ã¡ããããã©ã¡ãŒã¿ãŒãšããŠåãã³ã³ã¹ãã©ã¯ã¿ãŒã®1ã€ã䜿çšããŠããã®ã³ã¬ã¯ã·ã§ã³ãã€ã³ã¹ã¿ã³ã¹ã§ã©ããã§ããŸã
List<T>
ã
ICollectionViewã®å®è£ ïŒã³ã¬ã¯ã·ã§ã³ãã¥ãŒïŒ
åã®ã³ãŒãäŸã¯ããã¥ãŒã®é¢é£ã³ã³ãããŒã«ãä»ããŠè¡šç€ºã§ããèŠçŽ ã®ã³ã¬ã¯ã·ã§ã³ãè¿ããã¥ãŒã¢ãã«ã®åçŽãªããããã£ãå®è£ ããæ¹æ³ã瀺ããŠããŸãã
ObservableCollection<T>
ã€ã³ã¿ãŒãã§ãŒã¹ãå®è£ ããŠãããã
INotifyCollectionChanged
ããã¥ãŒã®ã³ã³ãããŒã«ã¯èŠçŽ ãè¿œå ãŸãã¯åé€ããããšèªåçã«æŽæ°ãããŸãã
å€ãã®å Žåããã¥ãŒã§ã®èŠçŽ ã®ã³ã¬ã¯ã·ã§ã³ã®è¡šç€ºæ¹æ³ãããæ£ç¢ºã«å¶åŸ¡ãããããã¥ãŒã®ã¢ãã«å ã§è¡šç€ºãããŠããèŠçŽ ã®ã³ã¬ã¯ã·ã§ã³ãšã®ãŠãŒã¶ãŒã®å¯Ÿè©±ã远跡ããå¿ èŠããããŸããããšãã°ããã¬ãŒã³ããŒã·ã§ã³ã¢ãã«ã«å®è£ ããããã¬ãŒã³ããŒã·ã§ã³ããžãã¯ã«åŸã£ãŠèŠçŽ ã®ã³ã¬ã¯ã·ã§ã³ããã£ã«ã¿ãŒåŠçãŸãã¯äžŠã¹æ¿ãããããã¥ãŒã§çŸåšéžæãããŠããèŠçŽ ã远跡ããŠããã¬ãŒã³ããŒã·ã§ã³ã¢ãã«ã«å®è£ ãããã³ãã³ããéžæãããèŠçŽ ã®ã¿ã«åœ±é¿ãäžããããã«ããããšãã§ããŸãã
WPFããã³Silverlightã¯ãã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ããããŸããŸãªã¯ã©ã¹ãæäŸããããšã«ããããã®ãããªã·ããªãªããµããŒãããŸãã
ICollectionView
ããã®ã€ã³ã¿ãŒãã§ã€ã¹ã¯ãã³ã¬ã¯ã·ã§ã³ã®ãã£ã«ã¿ãŒåŠçã䞊ã¹æ¿ãããŸãã¯ã°ã«ãŒãåãå¯èœã«ããããããã£ãšã¡ãœãããæäŸããçŸåšéžæãããŠããã¢ã€ãã ã远跡ãŸãã¯å€æŽããããšãã§ããŸãã SilverlightãšWPFã¯ã©ã¡ãããã®ã€ã³ã¿ãŒãã§ã€ã¹ã®å®è£ ãæäŸããSilverlightã¯ã¯ã©ã¹ãæäŸãã
PagedCollectionView
WPF ã¯ã¯ã©ã¹ãæäŸããŸã
ListCollectionView
ã
ã³ã¬ã¯ã·ã§ã³ãã¥ãŒã¯ã©ã¹ã¯ãéžæãããã¢ã€ãã ãèªåçã«è¿œè·¡ãã䞊ã¹æ¿ãããã£ã«ã¿ãŒãããã³ã¢ã©ãŒãã§ããããã«ãã¢ã€ãã ã®åºæ¬ã³ã¬ã¯ã·ã§ã³ãã©ããããããšã«ãã£ãŠæ©èœããŸãããããã®ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã¯ãã¯ã©ã¹ã䜿çšããŠãããã°ã©ã ãŸãã¯XAMLã§å®£èšçã«äœæã§ããŸã
CollectionViewSource
ã
ã泚æ
WPF CollectionView , . Silverlight ,ICollectionViewFactory
.
ãã¥ãŒã¢ãã«ã¯ãã³ã¬ã¯ã·ã§ã³ãã¥ãŒã¯ã©ã¹ã䜿çšããŠãããŒã¹ã³ã¬ã¯ã·ã§ã³ã®éèŠãªç¶æ æ å ±ã远跡ãããã¥ãŒã®UIãšã¢ãã«ã®åºã«ãªãããŒã¿ãšã®éã®è·åã®åé¢ããµããŒãã§ããŸããå®éãããã
CollectionViews
ã¯ã³ã¬ã¯ã·ã§ã³ããµããŒãããããã«ç¹å¥ã«èšèšããããã¬ãŒã³ããŒã·ã§ã³ã¢ãã«ã§ãã
ãããã£ãŠããã¥ãŒã¢ãã«å ããã³ã¬ã¯ã·ã§ã³å ã®ã¢ã€ãã ã®éžæããã£ã«ã¿ãŒåŠçã䞊ã¹æ¿ããã°ã«ãŒãåããŸãã¯è¿œè·¡ããå¿ èŠãããå Žåããã¥ãŒã¢ãã«ã¯ããã¥ãŒã«æäŸãããã³ã¬ã¯ã·ã§ã³ããšã«ã³ã¬ã¯ã·ã§ã³ãã¥ãŒã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãäœæããå¿ èŠããããŸãããã®åŸã次ã®ãããªéžæã€ãã³ãã«ãµãã¹ã¯ã©ã€ãã§ããŸãã
CurrentChanged
ããŸãã¯ãã¥ãŒã¢ãã«å ã®ã³ã¬ã¯ã·ã§ã³ãã¥ãŒã¯ã©ã¹ã¡ãœããã䜿çšããŠããã£ã«ã¿ãªã³ã°ã䞊ã¹æ¿ãããŸãã¯ã°ã«ãŒãåã管çããŸãã
ãã¥ãŒã¢ãã«ã¯ãåç §ãè¿ãèªã¿åãå°çšããããã£ãå®è£
ICollectionView
ããŠããã¥ãŒå ã®ã³ã³ãããŒã«ãã³ã¬ã¯ã·ã§ã³ãã¥ãŒã«ããŒã¿ããã€ã³ããããããšå¯Ÿè©±ã§ããããã«ããå¿ èŠããããŸããåºæ¬ã¯ã©ã¹ããã®ãã¹ãŠã®WPFããã³Silverlightã³ã³ãããŒã«ã¯ã
ItemsControl
èªåçã«ã¯ã©ã¹ãšå¯Ÿè©±ã§ããŸã
ICollectionView
ã
次ã®äŸã§ã¯ã
PagedCollectionView
Silverlightã䜿çšããŠãçŸåšéžæãããŠããã¯ã©ã€ã¢ã³ãã远跡ããŸãã
public class MyViewModel : INotifyPropertyChanged { public ICollectionView Customers { get; private set; } public MyViewModel(ObservableCollection<Customer> customers) { Customers = new PagedCollectionView(customers); Customers.CurrentChanged += new EventHandler(SelectedItemChanged); } private void SelectedItemChanged(object sender, EventArgs e) { Customer current = Customers.CurrentItem as Customer; ... } }
ãã¥ãŒã§ã¯ã次ã®
ItemsControl
ããã«
ListBox
ãproperty ãªã©ã䜿çšããŠããªã©
Customers
ã®ãã¥ãŒã¢ãã«ã®ããããã£ã«é¢é£ä»ããããšãã§ã
ItemsSource
ãŸãã
<ListBox ItemsSource="{Binding Path=Customers}"> <ListBox.ItemTemplate> <DataTemplate> <StackPanel> <TextBlock Text="{Binding Path=Name}"/> </StackPanel> </DataTemplate> </ListBox.ItemTemplate> </ListBox>
ãŠãŒã¶ãŒãUIã§ã¯ã©ã€ã¢ã³ããéžæãããšããã¬ãŒã³ããŒã·ã§ã³ã¢ãã«ã«éç¥ãããéžæããã¯ã©ã€ã¢ã³ãã®ã¿ã«é¢ä¿ããã³ãã³ããå®è¡ã§ããŸãã次ã®äŸã«ç€ºãããã«ããã¥ãŒã¢ãã«ã¯ãã³ã¬ã¯ã·ã§ã³ãã¥ãŒãªããžã§ã¯ãã®ã¡ãœãããåŒã³åºãããšã«ãããããã°ã©ã ã§UIã®çŸåšã®éžæãå€æŽããããšãã§ããŸãã
Customers.MoveCurrentToNext();
ã³ã¬ã¯ã·ã§ã³ãã¥ãŒã§éžæããã¢ã€ãã ãå€æŽããããšãUIãèªåçã«æŽæ°ãããéžæããã¢ã€ãã ã®ç¶æ ãèŠèŠçã«ç€ºãããŸããå®è£ ã¯WPFã«äŒŒãŠããŸã
PagedCollectionView
ããåã®äŸã§ã¯ãéåžžãã¯ã©ã¹
ListCollectionView
ããŸãã¯ã«çœ®ãæããããŸããã
BindingListCollectionView
以äžã«ç€ºããŸãã
Customers = new ListCollectionView(_model); Customers.CurrentChanged += new EventHandler(SelectedItemChanged);
ããŒã
ãã¥ãŒã§è¡šç€ºãŸãã¯ç·šéãããããŒã¿ãžã®ã¢ã¯ã»ã¹ãæäŸããããšã«å ããŠããã¥ãŒã¢ãã«ã¯ããŠãŒã¶ãŒãå®è¡ã§ãã1ã€ä»¥äžã®ã¢ã¯ã·ã§ã³ãŸãã¯æäœãå®çŸ©ããå¯èœæ§ããããŸãã WPFããã³Silverlightã§ã¯ããŠãŒã¶ãŒãUIãä»ããŠå®è¡ã§ããã¢ã¯ã·ã§ã³ãŸãã¯æäœã¯éåžžãã³ãã³ããšããŠå®çŸ©ãããŸããã³ãã³ãã¯ãUIã®ã³ã³ãããŒã«ã«ç°¡åã«çµã³ä»ããããšãã§ããã¢ã¯ã·ã§ã³ãŸãã¯æäœã衚瀺ãã䟿å©ãªæ¹æ³ãæäŸããŸãããããã¯ãå¿ èŠãªã¢ã¯ã·ã§ã³ãå®è£ ããã³ãŒããã«ãã»ã«åããèŠèŠçè¡šçŸããåé¢ããã®ã«åœ¹ç«ã¡ãŸãã
ã³ãã³ãã¯ãããŸããŸãªæ¹æ³ã§ãŠãŒã¶ãŒãèŠèŠçã«æ瀺ããã³åŒã³åºãããšãã§ããŸããã»ãšãã©ã®å ŽåãããŠã¹ã¯ãªãã¯ã«ãã£ãŠããªã¬ãŒãããŸãããããŒã¹ãããŒã¯ãã¿ãããžã§ã¹ãã£ããŸãã¯ãã®ä»ã®å ¥åã€ãã³ãã«ãã£ãŠããªã¬ãŒããããšãã§ããŸãããã¥ãŒå ã®ã³ã³ãããŒã«ã¯ãã¥ãŒã¢ãã«ã®ã³ãã³ãã«é¢é£ä»ããããŠããããããŠãŒã¶ãŒã¯ã³ã³ãããŒã«ã§å®çŸ©ãããå ¥åã€ãã³ãã䜿çšããŠããããåŒã³åºãããšãã§ããŸãããã¥ãŒå ã®UIã³ã³ãããŒã«ãšããŒã ã®éã®çžäºäœçšã¯åæ¹åã«ãªããŸãããã®å ŽåããŠãŒã¶ãŒãUIãæäœããããšã§ã³ãã³ããããªã¬ãŒãããåºæ¬çãªã³ãã³ãããªã³ãŸãã¯ãªãã«ãªããšãã³ã³ãããŒã«ãèªåçã«ããã¯è§£é€ãŸãã¯ããã¯ãããå ŽåããããŸãã
ãã¥ãŒã¢ãã«ã¯ã³ãã³ãã次ã®ããã«å®è£ ã§ããŸãCommand MethodããŸãã¯Command ObjectïŒã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ãããªããžã§ã¯ã
ICommand
ïŒãšããŠããããã®å Žåã§ãããã¥ãŒãšã³ãŒãããã€ã³ãã®è€éãªã€ãã³ãåŠçã³ãŒããå¿ èŠãšããã«ããã¥ãŒãšããŒã ã®çžäºäœçšã宣èšçã«å®çŸ©ã§ããŸããããšãã°ãWPFããã³Silverlightã®ç¹å®ã®ã³ã³ãããŒã«ã¯ã³ãã³ãããµããŒããããã¥ãŒã¢ãã«ã®
Command
typeããããã£
ICommand
ã«é¢é£ä»ããããããããã£ãæäŸããŸãããã®ä»ã®å Žåã
CommandBehavior
ã³ã³ãããŒã«ããã¬ãŒã³ããŒã·ã§ã³ã¢ãã«ã®ã³ãã³ãã¡ãœãããŸãã¯ã³ãã³ããªããžã§ã¯ãã«é¢é£ä»ããããã«äœ¿çšã§ããŸãã
ã泚æ
ããã€ãã¢ã¯ã察話ããžãã¯ãšããã€ãã¢ãã«ãã»ã«åããããã«äœ¿çšã§ãã匷åã§æè»ãªæ¡åŒµæ§ã¡ã«ããºã ã§ããããã¥ãŒå ã®ã³ã³ãããŒã«ã«å®£èšçã«é¢é£ä»ããããšãã§ããŸããCommandBehavior
ã³ãã³ããªããžã§ã¯ããŸãã¯ã¡ãœããããããŒã ãšå¯Ÿè©±ããããã«ç¹å¥ã«èšèšãããŠããªãã³ã³ãããŒã«ã«é¢é£ä»ããããã«äœ¿çšã§ããŸãã
次ã®ã»ã¯ã·ã§ã³ã§ã¯ãã¡ãœãããŸãã¯ã³ãã³ããªããžã§ã¯ããšããŠãã¥ãŒã«ã³ãã³ããå®è£ ããæ¹æ³ãããã³ãããããã¥ãŒå ã®ã³ã³ãããŒã«ã«é¢é£ä»ããæ¹æ³ã«ã€ããŠèª¬æããŸãã
ã³ãã³ããªããžã§ã¯ãã®å®è£
ã³ãã³ããªããžã§ã¯ãã¯ãã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ãããªããžã§ã¯ãã§ã
ICommand
ããã®ã€ã³ã¿ãŒãã§ã€ã¹ã¯
Execute
ãå¿ èŠãªã¢ã¯ã·ã§ã³ãã«ãã»ã«åããã¡ãœãã
CanExecute
ãšãç¹å®ã®æéã«ã³ãã³ããåŒã³åºãããšãã§ãããã©ããã瀺ãã¡ãœãããå®çŸ©ããŸãããããã®ã¡ãœããã¯äž¡æ¹ãšããã³ãã³ããžã®ãã©ã¡ãŒã¿ãŒãšããŠåäžã®åŒæ°ãåãå ¥ããŸããããžãã¯ãã³ãã³ããªããžã§ã¯ãã«ã«ãã»ã«åãããšããããšã¯ããã¹ããšä¿å®ãç°¡åã«ãªãããšãæå³ããŸãã
ã€ã³ã¿ãŒãã§ã€ã¹ã®å®è£ ã¯
ICommand
æ¯èŒçç°¡åã§ãããã ããã¢ããªã±ãŒã·ã§ã³ã§ç°¡åã«äœ¿çšã§ãããã®ã€ã³ã¿ãŒãã§ã€ã¹ã®å®è£ ã¯å€æ°ãããŸããããšãã°
ActionCommand
ãExpression Blend SDKã®ã¯ã©ã¹ããŸãã¯
DelegateCommand
PrismãæäŸããã¯ã©ã¹ã䜿çšã§ããŸãã
ã¯ã©ã¹
DelegateCommand
ãã¥ãŒã¢ãã«ã¯ã©ã¹å ã«å®è£ ãããã¡ãœãããããããåç §ãã2ã€ã®ããªã²ãŒããã«ãã»ã«åããŸãããããã®ããªã²ãŒããåŒã³åºãããšã«ããã
DelegateCommandBase
ã¡ãœãã
Execute
ãš
CanExecute
ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ããã¯ã©ã¹ããç¶æ¿ããŸã
ICommand
ãã¯ã©ã¹ã³ã³ã¹ãã©ã¯ã¿ãŒã®ãã¥ãŒã¢ãã«ã¡ãœããã§ããªã²ãŒããå®çŸ©ããŸã
DelegateCommand
ãããã¯æ¬¡ã®ããã«ãªããŸãã
public class DelegateCommand<T> : DelegateCommandBase { public DelegateCommand(Action<T> executeMethod, Func<T,bool> canExecuteMethod) :base((o) => executeMethod((T)o), (o) => canExecuteMethod((T)o)) { ... } }
ããšãã°ã次ã®ã³ãŒãã¯ããã¬ãŒã³ããŒã·ã§ã³ã¢ãã«ã¡ãœããããã³ã«ããªã²ãŒããäœæããããšã«ãã
DelegateCommand
ãã³ãã³ããè¡šãã€ã³ã¹ã¿ã³ã¹ãã©ã®ããã«
Submit
äœæããããã瀺ããŠããŸããã³ãã³ãã¯ããžã®ãªã³ã¯ãè¿ãèªã¿åãå°çšããããã£ãä»ããŠãã¥ãŒã«æž¡ãããŸãã
OnSubmit
CanSubmit
ICommand
public class QuestionnaireViewModel { public QuestionnaireViewModel() { this.SubmitCommand = new DelegateCommand<object>( this.OnSubmit, this.CanSubmit); } public ICommand SubmitCommand { get; private set; } private void OnSubmit(object arg) {...} private bool CanSubmit(object arg) { return true; } }
Execute
ãªããžã§ã¯ã
DelegateCommand
ã§ã¡ãœãããåŒã³åºããããšãåŒã³åºãã¯ãã³ã³ã¹ãã©ã¯ã¿ãŒã§å®çŸ©ããããªã²ãŒããä»ããŠããã¥ãŒã¢ãã«ã¯ã©ã¹ã®ã¡ãœããã«ãªãã€ã¬ã¯ããããŸããåæ§ã«ãã¡ãœãã
CanExecute
ãåŒã³åºããããšããã¥ãŒã¢ãã«ã¯ã©ã¹ã®å¯Ÿå¿ããã¡ãœãããåŒã³åºãããŸãã
CanExecute
ã³ã³ã¹ãã©ã¯ã¿ãŒå ã®ã¡ãœãããžã®ããªã²ãŒãã¯ãªãã·ã§ã³ã§ããããªã²ãŒããå®çŸ©ãããŠããªãå Žåã¯ã
DelegateCommand
å¿ ãæ»ããŸã
true
ã
CanExecute
ã
ã¯ã©ã¹
DelegateCommand
ã¯ãžã§ããªãã¯åã§ãã typeãã©ã¡ãŒã¿ãŒã¯ãæž¡ãããã³ãã³ããã©ã¡ãŒã¿ãŒã®ã¿ã€ã
Execute
ãšmethodsã決å®ããŸã
CanExecute
ãåã®äŸã§ã¯ãã³ãã³ããã©ã¡ãŒã¿ãŒã®ã¿ã€ãã¯
object
ã§ããã¯ã©ã¹ã®ãŠãããŒãµã«ããŒãžã§ã³ã§ã¯ãããŸãã
DelegateCommand
Prismã¯ãã³ãã³ããã©ã¡ãŒã¿ãŒãäžèŠãªå Žåã«äœ¿çšããããã«ãæäŸãããŠããŸãã
ãã¥ãŒã¢ãã«ã¯ããªããžã§ã¯ãã®
CanExecute
ã¡ãœãã
RaiseCanExecuteChanged
ãåŒã³åºãããšã«ãããã³ãã³ãã¡ãœããã®ç¶æ ã®å€åã瀺ãããšãã§ããŸã
DelegateCommand
ãããã«ãããã€ãã³ããããªã¬ãŒãã
CanExecuteChanged
ãŸããããŒã ã«é¢é£ä»ããããŠããUIã®ã³ã³ãããŒã«ã¯ãç¶æ ãæŽæ°ããŠãé¢é£ä»ããããããŒã ã®å¯çšæ§ãåæ ããŸãã
ä»ã®ã€ã³ã¿ãŒãã§ãŒã¹å®è£ ã¯å©çšå¯èœã§ã
ICommand
ãã¯ã©ã¹
ActionCommand
SDKã®Expression Blendã®äžã«ã¯ãããªãºã ã®ã¯ã©ã¹ã«äŒŒãŠãã
DelegateCommand
ãå ã«èª¬æããããããã¯ãåäžã®ããªã²ãŒãã¡ãœããããµããŒãããŠããŸã
Execute
ã Prismã¯ãå®è¡ã®ããã«
CompositeCommand
ã°ã«ãŒãåã§ããã¯ã©ã¹ãæäŸããŸã
DelegateCommands
ãã¯ã©ã¹ã®äœ¿çšã®è©³çŽ°ã«ã€ããŠã¯
CompositeCommand
ã第6ç« ãé«åºŠãªMVVMã·ããªãªãã®ãè€åã³ãã³ãããåç §ããŠãã ããã
ãã¥ãŒããã³ãã³ããªããžã§ã¯ããåŒã³åºã
ãã¥ãŒå ã®ã³ã³ãããŒã«ããã¥ãŒã¢ãã«ã«ãã£ãŠæäŸãããã³ãã³ããªããžã§ã¯ãã«é¢é£ä»ããã«ã¯ãå€ãã®æ¹æ³ããããŸããèŠçŽ WPFãšSilverlightç¹ã«ããç¶æ¿ããã4å¶åŸ¡ã
ButtonBase
ãªã©
Button
ã
RadioButton
ã
Hyperlink
ããŸãã¯ããç¶æ¿ã¯
MenuItem
ã容ææ§ãä»ããŠã³ãã³ããªããžã§ã¯ãã«æ¥ç¶ããããšãã§ããŸã
Command
ãWPFã¯ãžã®ãã€ã³ãããµããŒãã
ICommand
ãŠã
KeyGesture
ãŸãã
<Button Command="{Binding Path=SubmitCommand}" CommandParameter="SubmitOrder"/>
ããã«ãããããã£ã䜿çšããŠã³ãã³ããã©ã¡ãŒã¿ãèšå®ã§ããŸã
CommandParameter
ãæåŸ ããããã©ã¡ãŒã¿ãŒã®ã¿ã€ãã¯ãã¿ãŒã²ããã¡ãœãã
Execute
ããã³ã§æ±ºå®ãããŸã
CanExecute
ããŠãŒã¶ãŒããã®ã³ã³ãããŒã«ãæäœãããšãã³ã³ãããŒã«ã¯èªåçã«ã¿ãŒã²ããã³ãã³ããåŒã³åºããã³ãã³ããã©ã¡ãŒã¿ãŒãããã°ã
Execute
ã³ãã³ãã¡ãœããã«ãã©ã¡ãŒã¿ãŒãšããŠæž¡ãããŸããåã®äŸã§ã¯ããã¿ã³ãã¯ãªãã¯ãããšèªåçã«åŒã³åºãã
SubmitCommand
ãŸããããã«ããã³ãã©ãŒãå®çŸ©ãããŠãã
CanExecute
å Žåããã¿ã³ã
CanExecute
æ»ã
false
ãšèªåçã«ç¡å¹ã«ãªãããæå¹ã«ãªããšãã¿ã³ãæå¹ã«ãªããŸã
true
ã
å¥ã®ã¢ãããŒãã¯ãExpression Blendã®çžäºäœçšããªã¬ãŒãšåäœã䜿çšããããš
InvokeCommandAction
ã§ãã
<Button Content="Submit" IsEnabled="{Binding CanSubmit}"> <i:Interaction.Triggers> <i:EventTrigger EventName="Click"> <i:InvokeCommandAction Command="{Binding SubmitCommand}"/> </i:EventTrigger> </i:Interaction.Triggers> </Button>
ãã®ã¢ãããŒãã¯ãçžäºäœçšããªã¬ãŒãã¢ã¿ããã§ããã³ã³ãããŒã«ã«äœ¿çšã§ããŸããããã¯ãåå«
ButtonBase
ã§ã¯ãªãã³ã³ãããŒã«ã«ã³ãã³ããæ·»ä»ããå ŽåããŸãã¯ã¯ãªãã¯ã€ãã³ã以å€ã®ã€ãã³ãã§ã³ãã³ããåŒã³åºãå Žåã«ç¹ã«äŸ¿å©ã§ããã³ãã³ãã®ãã©ã¡ãŒã¿ãŒãæž¡ãå¿ èŠãããå Žåã¯ãããããã£ã䜿çšã§ããããšãæãåºããŠãã ãã
CommandParameter
ã
ã³ãã³ãã«çŽæ¥é¢é£ä»ããããšãã§ããã³ã³ãããŒã«ãšã¯ç°ãªããã³ãã³ã
InvokeCommandAction
ã®å€ã«åºã¥ããŠã³ã³ãããŒã«ãèªåçã«æå¹ãŸãã¯ç¡å¹ã«ããããšã¯ãããŸãã
CanExecute
ããã®åäœãå®è£ ããã«ã¯ãããããã£ããã€ã³ãããå¿ èŠããããŸã
IsEnabled
äžèšã®ããã«ããã¥ãŒã¢ãã«ã®é©åãªããããã£ã«ã³ã³ãããŒã«ããããã³ãã³ãã®å¯çšæ§ã«å¿ããŠãã³ã³ãããŒã«ãç¡å¹ã«ããç¬èªã®ç¹å¥ãªåäœãèšè¿°ããŸãã
ã泚æ
WPFããã³Silverlight 4ã®ã³ãã³ããµããŒãã³ã³ãããŒã«ã䜿çšãããšãã³ã³ãããŒã«ã宣èšçã«ã³ãã³ãã«ãã€ã³ãã§ããŸãããããã®ã³ã³ãããŒã«ã¯ããŠãŒã¶ãŒãæäœãããšæå®ãããã³ãã³ããåŒã³åºããŸããããšãã°ãã³ã³ãããŒã«ã®Button
å ŽåããŠãŒã¶ãŒããã¿ã³ãã¯ãªãã¯ãããšã³ãã³ããåŒã³åºãããŸããã³ãã³ãã«é¢é£ä»ãããããã®ã€ãã³ãã¯ä¿®æ£ãããŠãããå€æŽã§ããŸããã
ãŸããããã€ãã¢ã䜿çšãããšãã³ã³ãããŒã«ã宣èšçãªæ¹æ³ã§ã³ãã³ããªããžã§ã¯ãã«æ¥ç¶ã§ããŸãããã ããããã€ãã¢ãŒã¯ã³ã³ãããŒã«ã«ãã£ãŠçæãããããŸããŸãªã€ãã³ãã«é¢é£ä»ããããšãã§ããæå®ãããæ¡ä»¶ãæºãããããšãã«ãã¬ãŒã³ããŒã·ã§ã³ã¢ãã«å ã®é¢é£ä»ããããã³ãã³ããªããžã§ã¯ããŸãã¯ã³ãã³ãã¡ãœãããåŒã³åºãããã«äœ¿çšã§ããŸããã€ãŸããããã€ãã¢ã¯ããµããŒããããŠããã³ãã³ãã³ã³ãããŒã«ãšåãã·ããªãªã®å€ããå®è£ ã§ããæè»æ§ãšå¶åŸ¡ã®åºŠåããé«ããããšãã§ããŸãã
ããŒã ããµããŒãããã³ã³ãããŒã«ã䜿çšããã¿ã€ãã³ã°ãããã€ãã¢ã䜿çšããã¿ã€ãã³ã°ãããã³äœ¿çšããããã€ãã¢ã®çš®é¡ãéžæããå¿ èŠããããŸãããã¥ãŒã®ã³ã³ãããŒã«ããã¥ãŒã¢ãã«ã®æ©èœãšãªã³ã¯ããããããŸãã¯äžè²«æ§ã®ããã«åäžã®ã¡ã«ããºã ã䜿çšããå Žåã¯ãã³ãã³ãããµããŒãããã³ã³ãããŒã«ã§ãã£ãŠããåäœã®äœ¿çšãæ€èšããŠãã ããã
ã³ãã³ãããµããŒãããã³ã³ãããŒã«ã®ã¿ã䜿çšããå¿ èŠããããæšæºã®ã³ãã³ãåŒã³åºãã€ãã³ãã«æºè¶³ããŠããå Žåã¯ããããè¡ãå¿ èŠãããªããããããŸãããåæ§ã«ãéçºè ãŸãã¯UIéçºè ãExpression Blendã䜿çšããªãå ŽåãExpression Blendã®åäœã䜿çšããããã«å¿ èŠãªè¿œå ã®æ§æã®ãããã³ãã³ãäºæã®ã³ã³ãããŒã«ïŒãŸãã¯ã«ã¹ã¿ã ã¢ã¿ãããããåäœïŒã®ã¿ãéžæã§ããŸãã
ãã¥ãŒããã³ãã³ãã¡ãœãããåŒã³åºã
ãªããžã§ã¯ããšããŠã³ãã³ããå®è£ ããå¥ã®ã¢ãããŒã
ICommand
ã¯ãåã«ãã¥ãŒã¢ãã«ã®ã¡ãœãããšããŠã³ãã³ããå®è£ ããããã€ãã¢ã䜿çšããŠãããã®ã¡ãœããããã¥ãŒããçŽæ¥åŒã³åºãããšã§ãã
ããã¯ãåã®ã»ã¯ã·ã§ã³ã§ç€ºããåäœããã³ãã³ããåŒã³åºãã®ãšåæ§ã®æ¹æ³ã§å®çŸã§ããŸãããã ããã䜿çšãã代ããã«
InvokeCommandAction
ã䜿çšãã
CallMethodAction
ãŸãã次ã®äŸã§ã¯
Submit
ãããŒã¹ãã¥ãŒã¢ãã«ã®ã¡ãœããïŒãã©ã¡ãŒã¿ãŒãªãïŒãåŒã³åºããŸãã
<Button Content="Submit" IsEnabled="{Binding CanSubmit}"> <i:Interaction.Triggers> <i:EventTrigger EventName="Click"> <i:CallMethodAction TargetObject="{Binding}" Method="Submit"/> </i:EventTrigger> </i:Interaction.Triggers> </Button>
TargetObject
åŒã䜿çšãããšãã«ãåºã«ãªãããŒã¿ã³ã³ããã¹ãïŒãã¥ãŒã¢ãã«ïŒã«ãã€ã³ãããŸã
{Binding}
ããã©ã¡ãŒã¿ãŒ
Method
ã¯ãåŒã³åºãã¡ãœãããå®çŸ©ããŸãã
ã泚æ
CallMethodAction
. , ,InvokeCommandAction
,CallMethodAction
, .
ãã¬ãŒã³ããŒã·ã§ã³ã¢ãã«ãŸãã¯ã¢ãã«ã¯ãå€ãã®å ŽåãããŒã¿ãæ€èšŒãããã¬ãŒã³ããŒã·ã§ã³ã®ããŒã¿ã®æ£ç¢ºæ§ã®ãšã©ãŒãéç¥ããŠããŠãŒã¶ãŒãä¿®æ£ã§ããããã«ããå¿ èŠããããŸãã
SilverlightãšWPFã¯ããã¥ãŒå ã®ã³ã³ãããŒã«ã«é¢é£ä»ããããåã ã®ããããã£ãå€æŽããããšãã«çºçããããŒã¿æ€èšŒãšã©ãŒã®ç®¡çããµããŒãããŸããã³ã³ãããŒã«ã«é¢é£ä»ããããŠããåã ã®ããããã£ã®å Žåããã¥ãŒã¢ãã«ãŸãã¯ã¢ãã«ã¯ããããã£ã®setã¡ãœããå ã§ããŒã¿æ€èšŒãšã©ãŒãéç¥ããçä¿¡ããäžæ£ãªå€ãæåŠããŠäŸå€ãã¹ããŒããŸãã
ValidatesOnExceptions
ããŒã¿ãã€ã³ãã£ã³ã°ãªããžã§ã¯ãã®ããããã£ãçããå Žå
true
ãWPFããã³Silverlightã®ããŒã¿ãã€ã³ãã£ã³ã°ã¡ã«ããºã ã¯äŸå€ãåŠçããæ€èšŒãšã©ãŒã®ååšãèŠèŠçã«ç€ºããŸãã
ãã ããããããã£ã«ããäŸå€ã®ã¹ããŒã¯ãå¯èœãªå Žåã¯é¿ããå¿ èŠããããŸããå¥ã®ã¢ãããŒãã¯ããã¥ãŒã¢ãã«ãŸãã¯ã¢ãã«ã®ã¯ã©ã¹ã®
IDataErrorInfo
ããããã§ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ããããš
INotifyDataErrorInfo
ã§ãããããã®ã€ã³ã¿ãŒãã§ã€ã¹ã«ããããã¥ãŒã¢ãã«ãŸãã¯ã¢ãã«ã¯1ã€ä»¥äžã®ããããã£ã®å€ãæ€èšŒãããšã©ãŒã¡ãã»ãŒãžããã¥ãŒã«è¿ããŠããŠãŒã¶ãŒã«éç¥ããããšãã§ããŸãã
IDataErrorInfoã®å®è£
ã€ã³ã¿ãŒãã§ã€ã¹
IDataErrorInfo
ã¯ãããŒã¿ã®æ€èšŒãšãšã©ãŒã¡ãã»ãŒãžã®åºæ¬çãªãµããŒããæäŸããŸããããã¯ã2ã€ã®èªã¿åãå°çšããããã£ãå®çŸ©ããŸã
Error
ãã€ã³ãã¯ãµãŒã®ããããã£ïŒã€ã³ãã¯ãµãŒã®ãã©ã¡ãŒã¿ãŒãšããŠã®ããããã£ã®ååïŒãšproperty ã§ããäž¡æ¹ã®ããããã£ã¯æååå€ãè¿ããŸãã
ã€ã³ãã¯ãµãŒããããã£ã«ããããã¥ãŒã¢ãã«ãŸãã¯ã¢ãã«ã¯ã©ã¹ã¯ãååä»ãããããã£ã«åºæã®ãšã©ãŒã¡ãã»ãŒãžãæäŸã§ããŸãã空ã®æååãŸãã¯nullã®æ»ãå€ã¯ãå€æŽãããããããã£å€ãæå¹ã§ããããšããã¥ãŒã«ç€ºããŸãã Errorããããã£ã䜿çšãããšããã¥ãŒã¢ãã«ãŸãã¯ã¢ãã«ã¯ã©ã¹ã§ãªããžã§ã¯ãå šäœã®ãšã©ãŒã¡ãã»ãŒãžãæäŸã§ããŸããçŸåšããã®ããããã£ã¯SilverlightãŸãã¯WPFããŒã¿ãã€ã³ãã£ã³ã°ãšã³ãžã³ã«ãã£ãŠåŒã³åºãããªãããšã«æ³šæããŠãã ããã
ã€ã³ãã¯ãµãŒããããã£
IDataErrorInfo
ããŒã¿é¢é£ã®ããããã£ã衚瀺ããããšããããã³ãã®åŸå€æŽããããšãã«åŒã³åºãããŸããã€ã³ãã¯ãµãŒã®ããããã£ã¯ãå€åãããã¹ãŠã®ããããã£ã«å¯ŸããŠåŒã³åºããããããããŒã¿æ€èšŒãå¯èœãªéãé«éã§å¹ççã§ããããšãä¿èšŒããããã«ããã¹ãŠãè¡ãå¿ èŠããããŸãã
ãã¥ãŒå ã®ã³ã³ãããŒã«ãããããã£ã«ãã€ã³ãããå Žåãã€ã³ã¿ãŒãã§ã€ã¹ãä»ããŠã³ã³ãããŒã«ããã¹ãããããŒã¿ãã€ã³ãã®
IDataErrorInfo
ããããã£ã
ValidatesOnDataErrors
ã«èšå®ããŸã
true
ãããã«ãããããŒã¿ãã€ã³ãã£ã³ã°ãšã³ãžã³ãé¢é£ããããããã£ãããšã©ãŒæ å ±ãèŠæ±ããããã«ãªããŸãã
<TextBox Text="{Binding Path=CurrentEmployee.Name, Mode=TwoWay, ValidatesOnDataErrors=True, NotifyOnValidationError=True }"/>
INotifyDataErrorInfoã®å®è£
ã€ã³ã¿ãŒãã§ãŒã¹ã¯
INotifyDataErrorInfo
ãã€ã³ã¿ãŒãã§ãŒã¹ãããæè»ã§ã
IDataErrorInfo
ãããããã£ã®è€æ°ã®ãšã©ãŒãããŒã¿ã®éåææ€èšŒãããã³ãªããžã§ã¯ãã®ãšã©ãŒç¶æ ã®å€æŽããã¥ãŒã«éç¥ããæ©èœããµããŒãããŠããŸãããã ãã
INotifyDataErrorInfo
çŸåšã¯Silverlight 4ã§ã®ã¿ãµããŒããããŠãããWPF 4ã§ã¯äœ¿çšã§ããŸããã
ã泚æ
ãã®ã€ã³ã¿ãŒãã§ã€ã¹ã¯ã.NET Framework 4.5ã®WPFã§ããµããŒããããããã«ãªããŸããã
ã€ã³ã¿ãŒãã§ã€ã¹
INotifyDataErrorInfo
ã¯
HasErrors
ããã¥ãŒã¢ãã«ãããããã£ã«ãšã©ãŒïŒãŸãã¯è€æ°ã®ãšã©ãŒïŒãååšãããã©ããã瀺ãããšãå¯èœã«ããããããã£ãšããã¥ãŒã¢ãã«ã
GetErrors
ç¹å®ã®ããããã£ã®ãšã©ãŒã¡ãã»ãŒãžã®ãªã¹ããè¿ãããšãå¯èœã«ããã¡ãœãããå®çŸ©ããŸãã
ã€ã³ã¿ãŒãã§ãŒã¹
INotifyDataErrorInfo
ã¯ã€ãã³ããå®çŸ©ããŸã
ErrorsChanged
ãéåææ€èšŒã¹ã¯ãªããããµããŒããããã¥ãŒã¢ãã«ãŸãã¯ãã¥ãŒãã€ãã³ããä»ããŠç¹å®ã®ããããã£ã®ãšã©ãŒç¶æ ã®å€æŽãéç¥ã§ããããã«ããŸã
ErrorsChanged
ãããããã£å€ã¯ãããŒã¿ãã€ã³ãã£ã³ã°ã ãã§ãªããããšãã°ãWebãµãŒãã¹ãªã¯ãšã¹ããããã¯ã°ã©ãŠã³ãèšç®ã®çµæãšããŠãããŸããŸãªæ¹æ³ã§å€æŽã§ããŸããã€ãã³ã
ErrorsChanged
ããŒã¿æ€èšŒãšã©ãŒãèå¥ããããšããã«ããã¥ãŒã¢ãã«ããã¥ãŒã«ãšã©ãŒãå ±åã§ããããã«ããŸãã
ãµããŒãã®ããã«
INotifyDataErrorInfo
ãåããããã£ã®ãšã©ãŒã®ãªã¹ããä¿æããå¿ èŠããããŸããModel-View-ViewModelåç §å®è£ ïŒMVVM RIïŒ
ErrorsContainer
ã¯ããªããžã§ã¯ãã®ãã¹ãŠã®æ€èšŒãšã©ãŒã远跡ããã³ã¬ã¯ã·ã§ã³ã¯ã©ã¹ã䜿çšããŠãããè¡ã1ã€ã®æ¹æ³ã瀺ããŠããŸãããŸãããšã©ãŒãªã¹ããå€æŽãããå Žåã«éç¥ã€ãã³ããçæããŸãã次ã®äŸã¯ãã¯ã©ã¹ã䜿çšããïŒ
DomainObject
ã¢ãã«ã®ã«ãŒããªããžã§ã¯ãïŒãšå®è£
INotifyDataErrorInfo
ã瀺ããŠã
ErrorsContainer
ãŸãã
public abstract class DomainObject : INotifyPropertyChanged, INotifyDataErrorInfo { private ErrorsContainer<ValidationResult> errorsContainer = new ErrorsContainer<ValidationResult>( pn => this.RaiseErrorsChanged(pn)); public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged; public bool HasErrors { get { return this.ErrorsContainer.HasErrors; } } public IEnumerable GetErrors(string propertyName) { return this.errorsContainer.GetErrors(propertyName); } protected void RaiseErrorsChanged(string propertyName) { var handler = this.ErrorsChanged; if (handler != null) { handler(this, new DataErrorsChangedEventArgs(propertyName)); } } ... }
Silverlightã§ã¯ããã¥ãŒã¢ãã«ã®ããããã£ã«é¢é£ä»ããããã³ã³ãããŒã«ããŒã¿ã¯ãã€ãã³ãã«èªåçã«ãµãã¹ã¯ã©ã€ãã
INotifyDataErrorInfo
ãããããã£ã«ãšã©ãŒãå«ãŸããŠããå Žåãã³ã³ãããŒã«ã«ãšã©ãŒæ å ±ã衚瀺ããŸãã
äœæãšéçŽ
MVVMãã¿ãŒã³ã¯ãUIããã¬ãŒã³ããŒã·ã§ã³ãããžãã¹ããžãã¯ãããã³ããŒã¿ããåé¢ããã®ã«åœ¹ç«ã€ãããé©åãªã³ãŒããé©åãªã¯ã©ã¹ã«é 眮ããããšã¯ããã®ãã¿ãŒã³ãå¹æçã«äœ¿çšããããã®éèŠãªæåã®ã¹ãããã§ããããŒã¿ãšã³ãã³ãããã€ã³ãããããšã«ããããã¬ãŒã³ããŒã·ã§ã³ã¢ãã«ã®ã¯ã©ã¹ãšãã¬ãŒã³ããŒã·ã§ã³ã®éã®çžäºäœçšã管çããããšããèæ ®ããéèŠãªåŽé¢ã§ãã次ã®ã»ã¯ã·ã§ã³ã§ã¯ãå®è¡æã«ãã¥ãŒããã¥ãŒã¢ãã«ãã¢ãã«ã¯ã©ã¹ãã©ã®ããã«äœæãããçžäºäœçšãããã瀺ããŸãã
ã泚æ
, . Managed Extensibility Framework (MEF) Unity Application Block (Unity) , , . , . 6, « MVVM».
éåžžããã¥ãŒãšãã®ãã¬ãŒã³ããŒã·ã§ã³ã¢ãã«ã®éã«ã¯çŽæ¥çãªé¢ä¿ããããŸãããã¬ãŒã³ããŒã·ã§ã³ã¢ãã«ãšãã¬ãŒã³ããŒã·ã§ã³ã¯ããã¬ãŒã³ããŒã·ã§ã³ããŒã¿ã®ã³ã³ããã¹ãããããã£ã«ãã£ãŠççµåãããŠããŸããããã«ããããã¥ãŒã®èŠèŠçãªèŠçŽ ãšåäœãããã¥ãŒã¢ãã«ã®ããããã£ãã³ãã³ããããã³ã¡ãœããã«é¢é£ä»ããããšãã§ããŸãããã¥ãŒã®ã¢ãã«ã¯ã©ã¹ã®äœæãšã
DataContext
å®è¡æã®ããããã£ãä»ãããã¥ãŒãšãããã®é¢é£ä»ãã®äœæãå¶åŸ¡ããæ¹æ³ã決å®ããå¿ èŠããããŸãã
ãŸãããã¬ãŒã³ããŒã·ã§ã³ãšãã¬ãŒã³ããŒã·ã§ã³ã¢ãã«ãäœæããŠæ¥ç¶ãããšãã¯ã匱ãçµåãæ®ãããã«æ³šæããå¿ èŠããããŸããåã®ã»ã¯ã·ã§ã³ã§è¿°ã¹ãããã«ããã¬ãŒã³ããŒã·ã§ã³ã¢ãã«ã¯ãã¥ãŒã®ç¹å®ã®å®è£ ã«äŸåããã¹ãã§ã¯ãããŸãããåæ§ã«ããã¬ãŒã³ããŒã·ã§ã³ã¯ããã¬ãŒã³ããŒã·ã§ã³ã¢ãã«ã®ç¹å®ã®å®è£ ã«äŸåãã¹ãã§ã¯ãããŸããã
ã泚æ
ãã ãããã¥ãŒã¯ãããŒã¿ãã€ã³ãã£ã³ã°ã«ããããã¥ãŒã¢ãã«ã®ç¹å®ã®ããããã£ãã³ãã³ããããã³ã¡ãœããã«æé»çã«äŸåããããšã«æ³šæããŠãã ããããã¥ãŒã¢ãã«ãå¿ èŠãªããããã£ãã³ãã³ãããŸãã¯ã¡ãœãããå®è£ ããŠããªãå Žåãå®è¡æã«äŸå€ãçæããããããã°äžã«Visual Studioã®åºåãŠã£ã³ããŠã«è¡šç€ºãããŸãã
ãã¥ãŒãšãã¬ãŒã³ããŒã·ã§ã³ã¢ãã«ãå®è¡æã«äœæããã³ãªã³ã¯ããæ¹æ³ã¯å€æ°ãããŸããã¢ããªã±ãŒã·ã§ã³ã«æé©ãªæ¹æ³ãéžæãããã©ããã¯ããã¥ãŒãŸãã¯ãã¬ãŒã³ããŒã·ã§ã³ã¢ãã«ãæåã«äœæãããã©ãããããã³ããã°ã©ã ã§äœæããã宣èšçã«äœæãããã«ãã£ãŠå€§ããç°ãªããŸãã次ã®ã»ã¯ã·ã§ã³ã§ã¯ãå®è¡æã«ãã¬ãŒã³ããŒã·ã§ã³ã¯ã©ã¹ãšãã¬ãŒã³ããŒã·ã§ã³ã¢ãã«ãäœæããçžäºã«ãªã³ã¯ããäžè¬çãªæ¹æ³ã«ã€ããŠèª¬æããŸãã
XAMLãä»ããŠãã¥ãŒã¢ãã«ãäœæãã
ãããããæ瀺ããæãç°¡åãªã¢ãããŒãã¯ãXAMLã§å¯Ÿå¿ããè¡šçŸã¢ãã«ã宣èšçã«äœæããããšã§ãããã¥ãŒãäœæããããšã察å¿ãããã¥ãŒã¢ãã«ãªããžã§ã¯ããäœæãããŸãããã¥ãŒã¢ãã«ããã¥ãŒããŒã¿ã®ã³ã³ããã¹ããšããŠèšå®ãããããã«XAMLã§æå®ããããšãã§ããŸãã
XAMLããŒã¹ã®ã¢ãããŒãã¯
QuestionnaireView.xaml
ãBasic MVVM QuickStartã®ãã¡ã€ã«ã«ç€ºãããŠããŸãããã®äŸã§ã¯ã次ã®ããã«ã€ã³ã¹ã¿ã³ã¹
QuestionnaireViewModel
ãXAML
QuestionnaireView
ã§å®çŸ©ãããŠããŸãã
<UserControl.DataContext> <my:QuestionnaireViewModel/> </UserControl.DataContext>
ãšãã«
QuestionnaireView
äœæãããã³ããŒã
QuestionnaireViewModel
èªåçã«äœæãããããŒã¿ã³ã³ããã¹ãè¡šçŸãšããŠã€ã³ã¹ããŒã«ãããŸãããã®ã¢ãããŒãã§ã¯ããã¥ãŒã¢ãã«ã«ããã©ã«ãã³ã³ã¹ãã©ã¯ã¿ãŒïŒãã©ã¡ãŒã¿ãŒãªãïŒãå¿ èŠã§ãã
ãã¥ãŒã«ãããã¬ãŒã³ããŒã·ã§ã³ã¢ãã«ã®å®£èšçãªäœæãšå²ãåœãŠã«ã¯ãã·ã³ãã«ã§ãããMicrosoft Expression BlendãMicrosoft Visual Studioãªã©ã®ãã¶ã€ã³æããŒã«ã§ããŸãæ©èœãããšããå©ç¹ããããŸãããã®ã¢ãããŒãã®æ¬ ç¹ã¯ããã¥ãŒã察å¿ãããã¬ãŒã³ããŒã·ã§ã³ã¢ãã«ãèªèããŠããããšã§ãã
ããã°ã©ã ã§ãã¬ãŒã³ããŒã·ã§ã³ã¢ãã«ãäœæãã
ãã¥ãŒã¯ãã³ã³ã¹ãã©ã¯ã¿ãŒã§ããã°ã©ã ã«ãã£ãŠãã¥ãŒã¢ãã«ã®å¯Ÿå¿ããã€ã³ã¹ã¿ã³ã¹ãäœæããŸãã次ã®äŸã«ç€ºãããã«ãããŒã¿ã³ã³ããã¹ããšããŠèšå®ã§ããŸãã
public QuestionnaireView() { InitializeComponent(); this.DataContext = new QuestionnaireViewModel(); }
ã³ãŒãããã€ã³ããã¥ãŒå ã§ãã¥ãŒã¢ãã«ãããã°ã©ã ã§äœæããŠå²ãåœãŠãããšã«ã¯ããã®æ¹æ³ãç°¡åã§ãExpression BlendãVisual Studioãªã©ã®ãã¶ã€ã³æããŒã«ã§ããŸãæ©èœãããšããå©ç¹ããããŸãããã®ã¢ãããŒãã®æ¬ ç¹ã¯ããã¥ãŒããã¥ãŒã¢ãã«ã®é©åãªã¿ã€ããç¥ãå¿ èŠããããåé¢ã³ãŒããã¥ãŒã®ã³ãŒããå¿ èŠãšããããšã§ããUnityãMEFãªã©ã®äŸåæ§æ³šå ¥ã³ã³ãããŒã䜿çšãããšããã¥ãŒã¢ãã«ãšãã¥ãŒã®éã«åŒ±ããªã³ã¯ãæäŸã§ããŸãã詳现ã«ã€ããŠã¯ã第3ç« ãã³ã³ããŒãã³ãéã®äŸåé¢ä¿ã®ç®¡çããåç §ããŠãã ããã
ããŒã¿ãã³ãã¬ãŒããšããŠå®çŸ©ããããã¥ãŒã®äœæ
ãã¥ãŒã¯ããŒã¿ãã³ãã¬ãŒããšããŠå®çŸ©ã§ãããã¥ãŒã¢ãã«ã®ã¿ã€ãã«é¢é£ä»ããããŸããããŒã¿ãã³ãã¬ãŒãã¯ããã¥ãŒã¢ãã«ã衚瀺ããã³ã³ãããŒã«å ã®ãªãœãŒã¹ãŸãã¯åã蟌ã¿ãšããŠå®çŸ©ã§ããŸããã³ã³ãããŒã«ã®ãã³ã³ãã³ããã¯ãã¬ãŒã³ããŒã·ã§ã³ã¢ãã«ã®ã€ã³ã¹ã¿ã³ã¹ã§ãããããŒã¿ãã³ãã¬ãŒãã䜿çšããŠèŠèŠåããŸãã WPFããã³Silverlightã¯ãããŒã¿ãã³ãã¬ãŒããèªåçã«äœæãããã®ããŒã¿ã³ã³ããã¹ããå®è¡æã«ãã¥ãŒã¢ãã«ã®ã€ã³ã¹ã¿ã³ã¹ã«èšå®ããŸãããã®ã¡ãœããã¯ããªãã¬ãŒã³ããŒã·ã§ã³ã¢ãã«ãæåã«äœæããã次ã«ãªãã¬ãŒã³ããŒã·ã§ã³ã¢ãã«ãäœæãããç¶æ³ã®äŸã§ãã
ããŒã¿ãã³ãã¬ãŒãã¯æè»ã§è»œéã§ãã UIéçºè ã¯ãããã䜿çšããŠãè€éãªã³ãŒããªãã§ãã¬ãŒã³ããŒã·ã§ã³ã¢ãã«ã®èŠèŠçè¡šçŸãç°¡åã«å®çŸ©ã§ããŸããããŒã¿ãã³ãã¬ãŒãã¯ãUIïŒåé¢ã³ãŒãïŒããžãã¯ãå¿ èŠãšããªããã¥ãŒã«éå®ãããŸããããŒã¿ãã³ãã¬ãŒãã®èŠèŠçãªãã¶ã€ã³ãšç·šéã«ã¯ãMicrosoft Expression Blendã䜿çšã§ããŸãã
次ã®äŸã¯
ItemsControl
ã顧客ãªã¹ãã«é¢é£ä»ããããŠãããã®ã瀺ããŠããŸããåºæ¬ã³ã¬ã¯ã·ã§ã³ã®åã³ã³ã·ã¥ãŒããªããžã§ã¯ãã¯ããã¬ãŒã³ããŒã·ã§ã³ã¢ãã«ã®ã€ã³ã¹ã¿ã³ã¹ã§ããã¯ã©ã€ã¢ã³ãã®ãã¬ãŒã³ããŒã·ã§ã³ã¯ãçµã¿èŸŒã¿ã®ããŒã¿ãã³ãã¬ãŒãã«ãã£ãŠæ±ºå®ãããŸãã次ã®äŸã§ã¯ãåã³ã³ã·ã¥ãŒããã¬ãŒã³ããŒã·ã§ã³ã¢ãã«ã®ãã¬ãŒã³ããŒã·ã§ã³
StackPanel
ã¯
Name
ããã¬ãŒã³ããŒã·ã§ã³ã¢ãã«ã®ããããã£ã«é¢é£ä»ããããã©ãã«ãšããã¹ãããã¯ã¹ã§æ§æãããŠããŸãã
<ItemsControl ItemsSource="{Binding Customers}"> <ItemsControl.ItemTemplate> <DataTemplate> <StackPanel Orientation="Horizontal"> <TextBlock VerticalAlignment="Center" Text="Customer Name: " /> <TextBox Text="{Binding Name}" /> </StackPanel> </DataTemplate> </ItemsControl.ItemTemplate> </ItemsControl>
ããŒã¿ãã³ãã¬ãŒãããªãœãŒã¹ãšããŠæå®ããããšãã§ããŸãã次ã®äŸã¯ããªãœãŒã¹ãšããŠå®çŸ©ãããããŒã¯ã¢ããæ¡åŒµæ©èœãä»ããŠã³ã³ãããŒã«ã«é©çšãããããŒã¿ãã³ãã¬ãŒãã瀺ããŠããŸã
StaticResource
ã
<UserControl ...> <UserControl.Resources> <DataTemplate x:Key="CustomerViewTemplate"> <local:CustomerContactView /> </DataTemplate> </UserControl.Resources> <Grid> <ContentControl Content="{Binding Customer}" ContentTemplate="{StaticResource CustomerViewTemplate}" /> </Grid> </Window>
ããã§ãããŒã¿ãã³ãã¬ãŒãã¯ç¹å®ã®ã¿ã€ãã®ãã¥ãŒãã©ããããããããã¥ãŒã§åé¢ã³ãŒãã®åäœãå®çŸ©ã§ããŸãããããã£ãŠããã³ãã¬ãŒãåãããããŒã¿ãšã³ãžã³ã䜿çšããŠããã¬ãŒã³ããŒã·ã§ã³ãšãã¬ãŒã³ããŒã·ã§ã³ã¢ãã«ã®é¢ä¿ãè¡šé¢çã«æäŸã§ããŸããåã®äŸã§ã¯resources
UserControl
ã«ãã³ãã¬ãŒãã瀺ããŠããŸãããå€ãã®å Žåãã¢ããªã±ãŒã·ã§ã³ãªãœãŒã¹ã«é 眮ããã
ResourceDictionary
ãåå©çšãããããŸããããŒã¿ãã³ãã¬ãŒãã䜿çšããäŸã§ã¯ããã¥ãŒãäœæãããQuickStart MVVM ãã¡ã€ã«ã§ãã¥ãŒã¢ãã«ã«é¢é£ä»ããããŠããããšãããããŸã
QuestionnaireView.xaml
ã
éèŠãªæ±ºå®
ã¢ããªã±ãŒã·ã§ã³ã®äœææã«MVVMãã¿ãŒã³ã䜿çšããããšã«ããå ŽåãåŸã§å€æŽããã®ãé£ããç¹å®ã®èšèšäžã®æ±ºå®ãè¡ãå¿ èŠããããŸããéåžžããããã¯ã¢ããªã±ãŒã·ã§ã³å šäœã®ãœãªã¥ãŒã·ã§ã³ã§ãããã¢ããªã±ãŒã·ã§ã³å šäœã§äžè²«ããŠäœ¿çšããããšã§ãéçºè ãšãã¶ã€ããŒã®çç£æ§ãåäžããŸãã以äžã¯ãMVVMãã¿ãŒã³ãå®è£ ããéã®æãéèŠãªæ±ºå®äºé ã§ãã
- , . , , , Unity MEF. , . , . , «Advanced Construction and Wire-Up» «Advanced MVVM Scenarios» 6, «Advanced MVVM Scenarios.»
- , . . /
Command
ButtonBase
. , . , «» . - , .
IDataErrorInfo
,INotifyDataErrorInfo
. , , , , . , « » . - , Microsoft Expression Blend . Expression Blend UI , , , . , , Microsoft Expression Blend, ,
d:DataContext
d:DesignSource
. , «Guidelines for Creating Designer Friendly Views» 7 «Composing the User Interface».
WPFã§ããŒã¿ãã€ã³ãã£ã³ã°ã®è©³çŽ°ã«ã€ããŠã¯ãMSDNã«Â«ããŒã¿ãã€ã³ãã£ã³ã°Â»åç §ïŒhttp://msdn.microsoft.com/en-us/library/ms750612.aspxã
ïŒSilverlightã§ã®ããŒã¿ãã€ã³ãã£ã³ã°ã«ã€ããŠã¯ãMSDNã®Â«ããŒã¿ãã€ã³ãã£ã³ã°Â»ãã§ãã¯http://msdn.microsoft.com/en-us/library/cc278072(VS.95).aspxã
ïŒWPFã§ã®ã³ã¬ã¯ã·ã§ã³ãžã®ãªã³ã¯ã®è©³çŽ°ã«ã€ããŠã¯ãMSDNã«Â«æŠèŠããŒã¿ãã€ã³ãã£ã³ã°Â»ã§Â«ã³ã¬ã¯ã·ã§ã³ãžã®çµå»åç §http://msdn.microsoft.com/en-us/library/ms752347.aspxã
ïŒSilverlightã§ã®ã³ã¬ã¯ã·ã§ã³ãžã®ãªã³ã¯ã®è©³çŽ°ã«ã€ããŠã¯ãMSDNã«Â«ããŒã¿ãã€ã³ãã£ã³ã°Â»ã§Â«ã³ã¬ã¯ã·ã§ã³ãžã®çµå»åç §http://msdn.microsoft.com/en-us/library/cc278072(VS.95).aspxã
ãã¬ãŒã³ããŒã·ã§ã³ã¢ãã«ã®è©³çŽ°ã«ã€ããŠã¯ãMartin Fowlerã®Webãµã€ãã®ããã¬ãŒã³ããŒã·ã§ã³ã¢ãã«ããåç §ããŠãã ãããhttp ïŒ//www.martinfowler.com/eaaDev/PresentationModel.html
ããŒã¿ãã³ãã¬ãŒãã®è©³çŽ°ã«ã€ããŠã¯ãMSDNã®ãããŒã¿ãã³ãã¬ãŒãã®æŠèŠããåç §ããŠãã ããã ïŒhttp :
//msdn.microsoft.com/en-us/library/ms742521.aspx MEFã®è©³çŽ°ã«ã€ããŠã¯ãMSDNã®ãManaged Extensibility Framework Overviewããåç §ããŠãã ãã ïŒhttp : //msdn.microsoft.com/en-us /library/dd460648.aspx
ãŠããã£ã®è©³çŽ°ã«ã€ããŠã¯ãMSDNã®Â«ãŠããã£ã¢ããªã±ãŒã·ã§ã³ãããã¯Â»åç §ïŒhttp://www.msdn.com/unityã®
詳现ã«ã€ããŠã¯ã
DelegateCommand
ãš
CompositeCommand
äžéš9ãåç §ããŠãã ãã"ççµåã³ã³ããŒãã³ãéã®éä¿¡ãã