ããã«ã¡ã¯
ååã瀺åããããã«ããã®èšäºã¯Caliburn.Microãã¬ãŒã ã¯ãŒã¯ã«ã€ããŠåçºãããŸãã ãã®ãã¬ãŒã ã¯ãŒã¯ãWP7ãã©ãããã©ãŒã ã®éçºè ã«äœ¿çšãããšãæçšãªæ å ±ãããã解決ããã¿ã¹ã¯ããã®é·æãšçæãæäŸã§ããããšã瀺ããŸãã
ãããããã®èšäºå šäœã§çããããšããæãéèŠãªè³ªåã¯ãWP7ã®ããªã確ç«ãããçåœã§ãäœããã®ãã¬ãŒã ã¯ãŒã¯ã®åœ¢ã§å¥ã®äžéå±€ãå¿ èŠãªçç±ã§ãã
ãã®ãããã¯ã«èå³ããããªããç«ãžããããã
æºåãã
ãã®èšäºã®è³æã¯ãäž»ã«æ¢ã«WP7éçºã«ç²ŸéããŠãã人ã ã«èå³ããããšæããŸãã ãããã£ãŠãVSãªã©ã§ãããžã§ã¯ããäœæããæ¹æ³ã«ã€ããŠã¯èª¬æããŸãããããã§ã«ãããç¥ã£ãŠããããä»ã®å€ãã®ãªãŒãã³ãœãŒã¹ããåŠã¶ããšãã§ãããšä»®å®ããŸãã
ç¬ç«ããå®éšã«ã¯ã次ã®ãã®ãå¿ èŠã§ãã
- VS 2010 SP1
- Windows Phone SDK 7.1
- Caliburn.Micro
ãã¹ãã«äœ¿çšããWindows Phoneã¢ããªã±ãŒã·ã§ã³ãããžã§ã¯ããäœæããŸãã
åºæã§ã¯ãªãMVVMãŸãã¯Chapter
WP7ã¢ããªã±ãŒã·ã§ã³ã¯ãäžé£ã®ç»é¢/ããŒãžïŒWindows PhoneããŒãžïŒã§æ§æããããããã®ç»é¢ã¯ãDBå ã®ã¬ã³ãŒããªã©ã®ããŒã¿ãè¡šããŸãã åé¡ã¯ããã®ããŒã¿ãšUIèŠçŽ ãç»é¢äžã§æ¥ç¶ããæ¹æ³ã§ãã
ADã°ã«ãŒãã®ãŠãŒã¶ãŒã®ãªã¹ãã衚瀺ãããšããŸãã ç»é¢ã¿ã€ãã«ã¯ã°ã«ãŒãã®ååã«ãªããæ¬æã«ã¯ãŠãŒã¶ãŒã®ãªã¹ããå«ããªã¹ãããã¯ã¹ããããŸãã ããã¯ã©ã®ããã«è¡ãããšãã§ããŸããïŒ ã·ã³ãã«ã ãæè¯ã®è§£æ±ºçã¯ãããŒãžã®æ¬æïŒ* .xaml.csïŒã«äœããæžãããšã§ãïŒ
// PageTitle - TextBlock PageTitle.Text = GroupConnector(GroupId).Name; // Users - ListBox Users.ItemsSource = GroupConnector(GroupId).Users;
ããã¯æ©èœããŸããããã®ã¢ãããŒãã«ã¯å€ãã®æ¬ ç¹ããããŸãããããã®ããã€ãã次ã«ç€ºããŸãã
- èšèšãšä¿å®ãé£ããã ã³ãŒããšUIèŠçŽ ã¯å¯æ¥ã«é¢é£ããŠãããããéçºããã»ã¹ãè€éã«ãªããŸãã UIãšãã®é ä¿¡ã³ãŒããåæããã«ã¯è¿œå ã®ãªãœãŒã¹ãå¿ èŠã§ãã ãŸãããã®ãããªã³ãŒãã¯ãç¹ã«ãã®äŸã®ããã«2ã€ã§ã¯ãªãå€ãã®èŠçŽ ãå«ãå Žåãéšå€è ãåãå ¥ããã®ã¯å°é£ã§ãã
- ã²ã©ã䞊ååã ã€ãŸã 䜿çšããŠããããŒã¿ãç¥ã£ãŠããããã°ã©ããŒã¯ãæ¢æã®UIå®è£ ããªããã°ã³ãŒãã®ããã©ãŒãã³ã¹ããã§ãã¯ã§ããŸããã UIãšæ©èœã³ãŒãã®äœæã«ããŸããŸãªäººãé¢äžããŠããå Žåããã®åé¡ã¯ããã«æªåããŸãã
- åäœãã¹ããæžãã®ã¯é£ããã§ãã UIèŠçŽ ã«é¢é£ä»ããããã³ãŒãã¯ãåäœãã¹ããé£ããããã xamlãšãã®åšãã®ã€ã³ãã©ã¹ãã©ã¯ãã£å šäœãå¿ èŠã§ãããŠããããã¹ããå¥ã®ãããžã§ã¯ãã«ããå ŽåãUIã®æºåããŸã æŽã£ãŠããªãå ŽåïŒTDDæºæ ã®å ŽåïŒãé«éã§ã¯ãªããåé¡ããããŸãã
äžèšã®åé¡ã解決ããã«ã¯ã Model-View-ViewModelãã¿ãŒã³ã䜿çšããŸãã 圌ã«ã€ããŠã¯å€ãã®ããšãæžãããŠããã®ã§ã詳现ã«ã€ããŠã¯è§ŠããŸããã 詳现ã«ã€ããŠã¯ããã®ã¢ãããŒãã«ã€ããŠèªãããšãã§ããŸããããšãã°ã ãããŸãã¯ããã©ãŒã§å°ã
ã€ãŸããMVVMã¢ãããŒãã®æå³ã¯ãViewããã¬ãŒã³ããŒã·ã§ã³ããççºãããããšã§ãã ã€ãŸã é©åã«èšèšãããã·ã¹ãã ã§ã¯ãæçµçãªUIãã©ã®ããã«èŠããŠãããã¥ãŒã¯å€æŽãããŸããã ç¹å®ã®å®è£ ã«é¢é£ä»ããããŠããªãããŒã¿ã®é«ã¬ãã«ã®ãã¥ãŒãåæ ããŸãã
WP7ã¢ããªã±ãŒã·ã§ã³ãéçºãããšããMVVMã¢ãããŒãã¯ã©ãã§ã䜿çšãããŸãã ç¬èªã®æ±ºå®ãäžããã®ãããã°ããã¬ãŒã ã¯ãŒã¯ïŒ PrismãMVVM Light Toolkitãªã© ïŒã®åœ¢ã§æ¢è£œã®éçºã䜿çšãããã®ããããŸãã Caliburn.Microã¯ãŸãã«ãã®ãããªãã¬ãŒã ã¯ãŒã¯ã§ãã ã€ãŸã ããã¯ãäžé£ã®çŽ æµãªãã³ã䜿çšããMVVMã¢ãããŒãã®å®è£ ã§ãã
ã¯ããã«
ããŠããããžã§ã¯ããäœæããå¿ èŠãªCMïŒä»¥éãCaliburn.Microãæ¯åæžããªãããã«ãã®ã·ã§ãŒãã«ããã䜿çšããŸãïŒã©ã€ãã©ãªããã©ã°ã€ã³ããŸãããã ãããè¡ãã«ã¯ïŒ
- ãããžã§ã¯ãå ã«ãã©ã«ããŒCaliburnMicroïŒãŸãã¯ä»ã®ååïŒãäœæããããã«ãã¡ã€ã«Caliburn.Micro.dll ã Caliburn.Micro.Extensions.dllããã³System.Windows.Interactivity.dllãCMãã£ã¹ããªãã¥ãŒã·ã§ã³ïŒbin \ WP71 \ ReleaseïŒããã³ããŒããŸãã
- åç §ã«æ°ãããã¡ã€ã«ãè¿œå ããŸãã
CMãæ©èœãããã«ã¯ã ã¢ããªã±ãŒã·ã§ã³ã¢ããªã±ãŒã·ã§ã³ã®ã¡ã€ã³ã¯ã©ã¹ã«Bootstrapperãã€ã³ã¹ããŒã«ããå¿ èŠããããŸãã ãã®ã©ãããŒã¯ãã¢ããªã±ãŒã·ã§ã³ç¶æ ã®ãã¹ãŠã®å€æŽïŒã¢ã¯ãã£ãåãéã¢ã¯ãã£ãåãé·ç§»ãªã©ïŒãæ åœããæãéèŠãªããšãšããŠãViewModelã¯ã©ã¹ã®ãã¹ãŠãããã§èª¬æããŸãããããã«ã€ããŠã¯åŸã§è©³ãã説æããŸãã
SampleBootstrapperã¯ã©ã¹ã§ããPhoneBootstrapperã® äžäœã¯ã©ã¹ãäœæããŠããããžã§ã¯ãã«è¿œå ããŸãããã
public class SampleBootstrapper : PhoneBootstrapper { private PhoneContainer _container; protected override void Configure() { _container = new PhoneContainer(RootFrame); _container.RegisterPhoneServices(); AddCustomConventions(); } private static void AddCustomConventions(){} protected override object GetInstance(Type service, string key) { return _container.GetInstance(service, key); } protected override IEnumerable<object> GetAllInstances(Type service) { return _container.GetAllInstances(service); } protected override void BuildUp(object instance) { _container.BuildUp(instance); } }
ãã®ã¯ã©ã¹ãæ··ä¹±ãããªãã§ãã ãã;ãã以éã¯Configureã¡ãœããã®ã¿ãå¿ èŠã«ãªããŸãã
次ã«ã SampleBootstrapperã䜿çšããå¿ èŠãããããšãã¢ããªã±ãŒã·ã§ã³ã«äŒããå¿ èŠããããŸãã ãããè¡ãã«ã¯ã App.xamlãã¡ã€ã«ãç·šéããŠãBootstrapperãžã®ãªã³ã¯ä»¥å€ã®ãã¹ãŠãåé€ããå¿ èŠããããŸãã
<Application x:Class="CaliburnMicroSamples.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:CaliburnMicroSamples="clr-namespace:CaliburnMicroSamples"> <Application.Resources> <CaliburnMicroSamples:SampleBootstrapper x:Key="bootstrapper" /> </Application.Resources> </Application>
ãªããªã Launching ã Activatedãªã©ã®ã€ãã³ãåŠçãSampleBootstrapperãåŒãç¶ãããã«ãªã£ãã®ã§ ã以åã«ããã«é¢äžããå€ãã¡ãœãããApp.xaml.csããåé€ã§ããŸãã ã€ãŸã Appã¯ã©ã¹ã¯ããã·ã³ãã«ã«ãªããŸãã
public partial class App { public App() { InitializeComponent(); } }
ãã¹ãŠã以åã®ããã«èŠããå Žåãã€ãŸããã³ã³ãã€ã«ããŠå®è¡ããŸã CMã«é¢é£ããå€æŽã®åã«ãã€ãŸããã¢ããªã±ãŒã·ã§ã³ãã¯ã©ãã·ã¥ããå Žåããã¹ãŠãæ£ããå®è¡ããããã«å ã«é²ãããšãã§ããããšãæå³ããŸãããã®åŸããã¹ãçºçãã次ã®å®éšãç¶è¡ããåã«ä¿®æ£ããå¿ èŠããããŸãã
æåã®ViewModel
ãµãŒãããŒãã£ã®ãã¬ãŒã ã¯ãŒã¯ãšViewModelã䜿çšããã«ããã®ViewModelã¯æ¬¡ã®ããã«äœæãããŸãã ViewModelãå®è£ ããã¯ã©ã¹ãäœæããããããžã®ãªã³ã¯ãPhoneApplicationPageããŒãžalaå ã®DataContextã«æž¡ãããŸãã
DataContext = ViewModelsConstructor.GetViewModel(this);
xamlã§ãåãããšãã§ããŸãã ããã¯ãã¹ãŠãViewModelããã³ViewèŠçŽ ïŒUIã³ã³ãããŒã«ïŒã®ãã€ã³ãã£ã³ã°ãæ©èœããããã«å¿ èŠã§ãã
CMã§ã¯ããã®ã¢ãããŒãã¯å°ãç°ãªããŸãã ã³ã³ããã¹ããç¬èªã«èšå®ããå¿ èŠã¯ãããŸããããã¬ãŒã ã¯ãŒã¯ã䜿çšããŸãã ãŸããäžè¬ã«DataContextããã³* .xaml.csãã¡ã€ã«ã䜿çšããå¿ èŠã¯ãããŸãããããã«ãããç¹ã«Viewãxamlããããã«é¢ããŠãçæ³çãªMVVMã«ããã«è¿ã¥ãããšãã§ããŸãã CMã¯å®£èšåã¢ãããŒãã䜿çšããŠVMïŒViewModelïŒãèšè¿°ããŸãããããã«ã€ããŠã¯åŸã§èª¬æããŸãã
ã¢ããªã±ãŒã·ã§ã³ã®äœæåŸãããã©ã«ãç»é¢ã®MainPageããã§ã«ãããŸãã CMã䜿çšããŠViewModelãå®è£ ããã¯ã©ã¹ãäœæããŠã¿ãŸãããã ãããè¡ãã«ã¯ã xamlæ¡åŒµåãæã€ãã¡ã€ã«ã®ååãšåãååã§ã¯ã©ã¹ãäœæãã ViewModelã®æåŸã«ïŒã€ãŸãMainPageViewModelã¯ã©ã¹ïŒãåãååã®å¥ã®ãã¡ã€ã«ã«é 眮ãã Screenã¯ã©ã¹CMããç¶æ¿ããŸãïŒãã¹ãŠãã®ã¯ã©ã¹ã«æ¢ã«ã«ãã»ã«åãããŠããŸãçŸåšã®ããŒãžãæäœããããã®ã¡ãœããã§ãããããã«ã€ããŠã¯åŸã§èª¬æããŸãïŒã ã€ãŸã ã¯ã©ã¹ã¯æ¬¡ã®ããã«ãªããŸãã
public class MainPageViewModel : Screen { public MainPageViewModel() { } }
æåŸã«ããã¹ãããšã¯ãBootstrapper'eã«VMãç»é²ããããšã§ãã ãããè¡ãã«ã¯ã SampleBootstrapperã¯ã©ã¹ã®Configureã¡ãœããã§ã次ã®ã³ãŒããè¿œå ããŸãã
_container.PerRequest<MainPageViewModel>();
ãããŠããã ãã§ãïŒ ViewModelãäœæãããäœææã«CMã«ãã£ãŠMainPageããŒãžã«ãªã³ã¯ãããŸãã PerRequestã¯ãMainPageããŒãžãèŠæ±ããããã³ã«MainPageViewModelã¯ã©ã¹ãäœæãããããšãæå³ããŸãã Singletonã¡ãœããã䜿çšããå ŽåãMainPageViewModelã¯ã©ã¹ã¯åŸç¶ã®ãã¹ãŠã®ãªã¯ãšã¹ãã§åå©çšããŸãã
ãã€ã³ãã£ã³ã°ããããã£ã®åäœãèŠãŠã¿ãŸãããã ãããè¡ãã«ã¯ãVMã¯ã©ã¹ã«PageTitleããããã£ãè¿œå ããã ãµã³ãã«ããŒãž ããªã©ã®å€ãå²ãåœãŠãŸãã
public class MainPageViewModel : Screen { public string PageTitle { get; set; } public MainPageViewModel() { PageTitle = "sample app"; } }
ãããŠãã¢ããªã±ãŒã·ã§ã³ãå®è¡ããŸãã ããŒãžã¿ã€ãã«ãå€æŽãããŸããïŒ ããã¯ãCMãViewModelãšViewã®é¢ä¿ã«é¢ãããã¹ãŠã®è³ªåãåãåããPageTitleããããã£ããã®ååã§ãªã³ã¯ããããã§ãïŒxamlã§ãåŒã³åºãããŸãïŒã
Text="{Binding PageTitle, Mode=TwoWay}"
çŽæ¥ãªã³ã¯åœä»€ïŒala
Text="{Binding PageTitle, Mode=TwoWay}"
ïŒãä»ããããªãã¿ã®ãã€ã³ãã£ã³ã°ãæ©èœããŸããããããªãã§ã¯ã¯ããã«ç°¡åã§ããããšãèªã
Text="{Binding PageTitle, Mode=TwoWay}"
ã
ããã¯ããªãåçŽãªäŸã§ããããã®ç¹ã«ã€ããŠã¯ãããè€éãªãã€ã³ãã£ã³ã°ãªãã·ã§ã³ãšCMæ©èœã«ã€ããŠã¯åŸã§èª¬æããŸãããä»ã®ãšããã¯ç¶è¡ããŸãã
ããã²ãŒã·ã§ã³
ADã®ãŠãŒã¶ãŒãšã°ã«ãŒãã®äŸãèŠããŠããŸããïŒ ã°ã«ãŒãã«é¢ããæ å ±ã衚瀺ããããã«ãã°ã«ãŒããäœã§ãããã«é¢ããæ å ±ãã©ããã«éä¿¡ããå¿ èŠããããšä»®å®ããããšã¯è«ççã§ãã ç°¡åã«ããããã«ãããã圌女ã®ååã«ããŸãã ããã¯ãã¡ããVMã®ãã©ãããã§ãããªããªãã 圌女ã¯ãå¿ èŠãªããŒã¿ããã¥ãŒã«è¿ãããã«ããã®ã°ã«ãŒããäœã§ããããç¥ãå¿ èŠããããŸãã
ãã®åé¡ã解決ããæšæºçãªæ¹æ³ã¯ããã©ã¡ãŒã¿ãŒã䜿çšããããã²ãŒã·ã§ã³ã§ãã ã€ãŸã ãã®ãããªç»é¢ïŒãã®å Žåã¯ãŠãŒã¶ãŒã®ãªã¹ãïŒã«ç§»åããããšèšãããã©ã¡ãŒã¿ãŒãšããŠã°ã«ãŒãèå¥åãæž¡ããŸãã éåžžãããã¯æ¬¡ã®ããã«è¡ãããŸãã
NavigationService.Navigate(new Uri("/GroupPage.xaml?name=Administrators", UriKind.Relative));
ãããŠãGroupPage.xamlããŒãžã®OnNavigatedToã§ããã®ãã©ã¡ãŒã¿ãŒã¯æ§ç¯ã«ãã£ãŠååŸãããŸãã
var name = NavigationContext.QueryString["name"];
次ã«ãã¢ãã«ãå®è£ ããã¯ã©ã¹ã«ïŒããšãã°ãã³ã³ã¹ãã©ã¯ã¿ãŒãä»ããŠïŒæž¡ããã次ã«DataContextã«æž¡ãããŸãã
åæããŠãã ããããã®ãããªåçŽãªã¿ã¹ã¯ã®æãçŸãã解決çã§ã¯ãããŸããã
ãã1ã€ã®äžè¬çãªæ¹æ³ã¯ã PhoneApplicationService.Current.Stateã䜿çšããŠå ±æããŒã¿ã亀æããããšã§ãã
PhoneApplicationService.Current.State["name"] = "Administrators";
ãŸãã¯ãåã«Applicationã¯ã©ã¹å ã®ã°ããŒãã«å€æ°ãä»ããŠããã®ã€ã³ã¹ã¿ã³ã¹ã®å©ç¹ãApplication.Currentãä»ããŠã©ãããã§ãååŸã§ããŸã ã
äžè¬çã«ãããã¯ãã¹ãŠéåžžã«æ²ãã£ãŠããŸãã æåŸã®2ã€ã®äŸã¯ãç¹ã«ãããè¡ãæšæºçãªæ¹æ³ãããå Žåã«ãç»é¢éã§ããŒã¿å ±æã䜿çšããã®ã¯ã°ãããŠãããããè¯ããããŸããã æåã®äŸã¯ãéäžã§ã¿ã€ããã¹ãããã®ãéåžžã«ç°¡åã§ããããæªãã§ãããã®å€ãïŒå€ãã®å Žåã¯ããã«æªãããšã«ïŒNavigationContextããåŒãåºãããã®åŸãã¹ãŠãã©ããã«è»¢éãããæ®»ããæºè¶³ã§ããŸããã
ãããŠãCMã§ãããè¡ãæ¹æ³ã¯æ¬¡ã®ãšããã§ãã
_navigationService.UriFor<GroupPageViewModel>() .WithParam(x => x.Name, "Administrators") .Navigate();
GroupPageViewModel -MainPageViewModelãšåæ§ã«ããããªãã¯ããããã£Nameã䜿çšããŠäœæãããVMã
public class GroupPageViewModel : Screen { public string Name { get; set; } }
_navigationServiceã¯ã INavigationServiceãå®è£ ãããªããžã§ã¯ãã§ããããã¯ã Screenã¯ã©ã¹ããç¶æ¿ããã ç»é¢éã移åããããã«äœ¿çšãããVMå ã§ååŸã§ããŸãã WithParamã¡ãœããã䜿çšãããšãå®å ããŒãžã§VMããããã£ãèšå®ã§ããŸãã INavigationServiceã¯ãæšæºã®NavigationServiceã®ã©ãããŒã§ããããã«ã¯ããã¹ãŠã®æ©èœãå«ãŸããŠãããè¿œå æ©èœãè¿œå ãããŠããŸãã
MainPageViewModelã¯ã©ã¹ã®INavigationServiceã€ã³ã¹ã¿ã³ã¹ãååŸããæ¹æ³ã¯æ¬¡ã®ãšããã§ããCMã¯INavigationServiceãªããžã§ã¯ããMainPageViewModelã³ã³ã¹ãã©ã¯ã¿ãŒã«æž¡ãã ãã§ãã
public class MainPageViewModel : Screen { private INavigationService _navigationService; public string PageTitle { get; set; } public MainPageViewModel(INavigationService navigationService) { PageTitle = "sample app"; _navigationService = navigationService; } }
å©ç¹ã¯æããã§ãïŒ
- éçºè ãVMã«ãã©ã¡ãŒã¿ãŒãæž¡ãããã«èšè¿°ããå¿ èŠãããã³ãŒãã¯ã»ãšãã©ãããŸããã
- ãªããªã INavigationServiceã¯å®å VMã¯ã©ã¹ã«ãã£ãŠç¹åãããŠããããã©ã¡ãŒã¿ãŒã¯ãã®ã¯ã©ã¹ã«é¢é£ããŠèšå®ãããŸãããããã®ãã©ã¡ãŒã¿ãŒãèšå®ãããšãã«ãã¹/ã·ãŒã«ãè¡ãããšã¯äžå¯èœã§ãã ãã®ãããªã³ãŒãã¯åã«ã³ã³ãã€ã«ãããŸããã
- ãªããªã ã€ã³ã¿ãŒãã§ã€ã¹ãéä¿¡ããããšãINavigationServiceã®åäœãååã«æ¿¡ããŸããããã¯ãåäœãã¹ããèšè¿°ãããšãã«éåžžã«äŸ¿å©ã§ãã
- ã³ãŒãã¯UIããå®å šã«è§£æŸãããŠããŸãã
çæïŒ
- è€ååããã®æ¹æ³ã§æž¡ãããšã¯ã§ããŸããã ããã«ã¯éæ³ã¯ãããŸãããCMã¯WP7ã«ãªãããšãè¡ãããšãã§ããŸããã ç¬èªã®æ©èœã«åºã¥ããŠããŸãã å®è£ ã¯ãNavigationServiceã®æšæºå®è£ ïŒæåã®äŸã®å®è£ ïŒã«åºã¥ããŠããŸãã ãã ããã·ãªã¢ã«åã䜿çšããŠCMãœãŒã¹ãå°ã調æŽãããšããããåé¿ã§ããŸãã
INotifyPropertyChanged
ADãããŠãŒã¶ãŒãé¢ããå¥ã®äŸã瀺ããŸãã ã¡ãŒã«ããã°ã©ã ãããããã®ããŒãžã®1ã€ã«ãæªèªã¡ãã»ãŒãžã®ãããžãããå©çšå¯èœãªã¡ãŒã«ããã¯ã¹ã®ãªã¹ãããããšããŸãã
åã®äŸãšã®äž»ãªéãã¯ãããŒã¿ãéçã§ã¯ãªããæéã®çµéãšãšãã«å€åããå¯èœæ§ãããããšã§ãïŒæªèªã¡ãã»ãŒãžã®ã«ãŠã³ã¿ãŒïŒã ã€ãŸã æªèªã¡ãã»ãŒãžã®æ°ã«è²¬ä»»ãããããããã£ããããšæ³åããå Žåããããå€æŽãããããšãViewã«éç¥ããã¡ã«ããºã ãå¿ èŠã§ãã ãã®ç®çã®ããã«ãéç¥ã¡ã«ããºã ã¯INotifyPropertyChangedã€ã³ã¿ãŒãã§ã€ã¹ã®å®è£ ã«åºã¥ããŠäœ¿çšãããŸãã ãã®ã¢ãããŒããå®è£ ããæšæºçãªæ¹æ³ã¯æ¬¡ã®ãšããã§ãã
public class MailboxPageViewModel : INotifyPropertyChanged { private int _unreadCount; public int UnreadCount { get { return _unreadCount; } set { _unreadCount = value; NotifyPropertyChanged("UnreadCount"); } } public event PropertyChangedEventHandler PropertyChanged; public void NotifyPropertyChanged(string propertyName) { if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } }
ã芧ã®ãšããã UnreadCountããããã£ãå€æŽããããš ãã€ãã³ãPropertyChangedããã㧠éç¥ãããŸããããã«ãããå€ã®Viewãåèªã¿åããããŸãã
ãã®ã³ãŒãã«ã¯2ã€ã®æ¬ ç¹ããããŸãã
- ããããã£åã¯ååã§èšå®ãããããã«ã¯ãšã©ãŒã䌎ããŸãã
- UIã¹ã¬ããããã§ã¯ãªãããããã£ãæŽæ°ãããšãç¡å¹ãªã¯ãã¹ã¹ã¬ããã¢ã¯ã»ã¹äŸå€ã§ã¢ããªã±ãŒã·ã§ã³ãã¯ã©ãã·ã¥ããŸãã
1ã€ç®ã¯Expressionã䜿çšããŠè§£æ±ºããã2ã€ç®ã¯Dispatcher.CheckAccessïŒïŒãä»ããŠçŸåšã®ã¹ã¬ããã§æäœãå®è¡ããå¯èœæ§ããã§ãã¯ããæäœãå®è¡ã§ããªãå Žåã¯æ¢ã«UIã¹ã¬ããã§åèµ·åããŸãã é£ããããšã§ã¯ãããŸããããããã§ãç§ã®èªè»¢è»ãç¹ã«CMã§ã¯ããã«ã€ããŠèããŸããã äžèšã®äŸã眮ãæããã³ãŒãã¯æ¬¡ã®ãšããã§ãã
public class MailboxPageViewModel : Screen { private int _unreadCount; public int UnreadCount { get { return _unreadCount; } set { _unreadCount = value; NotifyOfPropertyChange(() => UnreadCount); } } }
CMã¡ãœããã®NotifyOfPropertyChangeã¯ã説æãããŠããåé¡ã解決ãããããã«äœ¿çšå¯èœãã§ãã
CMã§ã¯ãINotifyPropertyChangedãå®è£ ãããªããžã§ã¯ãã®ã³ã¬ã¯ã·ã§ã³ãä¿åããããã«äœ¿çšãããObservableCollectionã¯ã©ã¹ã®å¥ã®ã¯ã©ã¹ã®éUIã¹ã¬ããããã®ã¢ã¯ã»ã¹ã«é¢ããåæ§ã®åé¡ã解決ããBindableCollectionã¯ã©ã¹ãèŠã€ããããšãã§ããŸãã ã€ãŸã BindableCollectionã䜿çšããå Žåãã³ã¬ã¯ã·ã§ã³ã¡ãœãããã©ã®ã¹ããªãŒã ã§åŒã³åºãããããå¿é ããå¿ èŠã¯ãããŸããã
å¢ç³
éçºè ãWP7çšã®ã¢ããªã±ãŒã·ã§ã³ãäœæããéã«æ±ããåé¡ã®1ã€ã¯ã Tombstoneã®ç¶æ ãçµäºããåŸã«ã¢ããªã±ãŒã·ã§ã³ã®ç¶æ ã埩å ããå¿ èŠãããããšã§ãã
WP7ã§ã¯ã PhoneApplicationService.State ã IsolatedStorageãããã³ãã®ä»ã®ãœãªã¥ãŒã·ã§ã³ãããã«äœ¿çšãããŸãã è¿œå ã®ã©ãããŒãªãã§äœæ¥ããããšã¯ããã»ã©äŸ¿å©ã§ã¯ãããŸããã CMã¯ãšã¬ã¬ã³ããªãœãªã¥ãŒã·ã§ã³ãæäŸããŸãã VMããŒã¿ãå»æ£æšèã§ä¿è·ãããå Žåã¯ãVMãšããååãšçµäºã¹ãã¬ãŒãžã®ã¯ã©ã¹ãäœæããã ãã§ãã ãŠãŒã¶ãŒã®ãªã¹ããæã€ãã®äŸã®ã¯ã©ã¹ã¯ã GroupPageViewModelStorageãšåŒã°ãã 次ã®ããã«ãªããŸãã
public class GroupPageViewModelStorage : StorageHandler<GroupPageViewModel> { public override void Configure() { Property(x => x.Name) .InPhoneState() .RestoreAfterActivation(); } }
StorageHandlerã¯ãVMå ã«ããŒã¿ãä¿åããããã®æŠç¥ãå®è£ ããCMã¯ã©ã¹ã§ãã ãã®äŸã§ã¯ãPhoneApplicationService.Stateå ã«Nameããããã£ãä¿åããããŒãžã®ã¢ã¯ãã£ãåãšãšãã«ããŒã¿ã埩å ããå¿ èŠããããšèšããŸãã
ãªããªã CMã¯äœãç¥ãããã¢ãã«ã«ä¿åãããŠããããŒã¿ãç¥ãããšãã§ããªãããããããã¯åå¥ã«ä¿åããå¿ èŠããããŸãã ãããè¡ãã«ã¯ãé©åãªBootstapperã¡ãœããïŒèµ·åãçµäºãéã¢ã¯ãã£ãåãªã©ïŒå ã«ã¢ããªã±ãŒã·ã§ã³ã®ããžãã¯ã«äžèŽããå¿ èŠãªã·ãªã¢ã«å/éã·ãªã¢ã«åã³ãŒããè¿œå ããŸãã
æåã®éšåã®çµãã
ããã§ãç§ã¯ãã®èšäºãæåã«æã£ãŠãããããå€ããªã£ãŠããããšããããŠãã£ãšãã£ãšæžãå¿ èŠãããããšã«æ°ä»ããŸããã ããã¯å ¥éçãªã¬ãã¥ãŒèšäºãšããŠã¯ååãããããã2ã€ã®éšåã«åããããšã«ããŸããã
ç¶è¡ããã«ã¯...