ぶっちゃけ、まだよくわからんけど、なぜか動く。
使用しているライブラリはMvvmLight Toolkitです。
Prismよりもこっちのほうがなんとなく解説が多い気がしたので。
▼/ViewModel/ViewModelLocator.cs
→ViewModelのインスタンスを管理。ここで必要なインスタンスは作成しておく。
<Application.Resources> <ResourceDictionary> <vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" /> </ResourceDictionary> </Application.Resources>みたいな感じで、App.xamlでリソースに登録しておく。
これで、どのxamlからでもリソースに使えるようになる。
▼/Views/MainWindow.xaml
→Frameをひとつ作成して、そのフレームの"Source"にCurrentPageをバインド。
▼/ViewModel/MainViewModel.cs
→CurrentPageを管理する。MessengerのNotificationMessageを受け取り、CurrentPageを更新することで、画面遷移を管理する。
コンストラクタ内で
CurrentPage = "/Views/Page1.xaml"; Messenger.Default.Registerこんな感じで、受け取ったメッセージに応じて処理を変更する。(this, x => { switch (x.Notification) { case Notifications.ToPage1: CurrentPage = "/Views/Page1.xaml"; break; case Notifications.ToPage2: CurrentPage = "/Views/Page2.xaml"; break; } });
Notificationsクラスとか作って、画面遷移用のパラメータは一元管理しておく。
▼/ViewModel/Page1ViewModel.cs
→Page1.xaml用のViewModel。Page2に遷移するためのコマンドを持つ。
private ICommand _ToPage2Command; public ICommand ToPage2Command { get { if (_ToPage2Command == null) { _ToPage2Command = new RelayCommand(ToPage2); } return _ToPage2Command; } } private void ToPage2() { var message = new NotificationMessage(Notifications.ToPage2); Messenger.Default.Sendこんな感じで好きなデータを送ることもできるらしい。(message); }
var message = (TitleData)_SelectedItem; Messenger.Default.Send画面遷移とデータを送ることを同時にすることもできる。その場合、データを送って、画面遷移のコマンドを書けば良い。(message);
だけど、このままだと、どのページからどこにMessengerを送っているのかが管理できなくなるので、そのための対応もできる、らしい。
まだそこまでは理解できていないんです。