MVVMの理解1(C#)
なんでも、WPFではMVVMがよく使われるらしいので、自分なりの理解のめも。
ぶっちゃけ、まだよくわからんけど、なぜか動く。
使用しているライブラリはMvvmLight Toolkitです。
Prismよりもこっちのほうがなんとなく解説が多い気がしたので。
▼/ViewModel/ViewModelLocator.cs
→ViewModelのインスタンスを管理。ここで必要なインスタンスは作成しておく。
これで、どのxamlからでもリソースに使えるようになる。
▼/Views/MainWindow.xaml
→Frameをひとつ作成して、そのフレームの"Source"にCurrentPageをバインド。
▼/ViewModel/MainViewModel.cs
→CurrentPageを管理する。MessengerのNotificationMessageを受け取り、CurrentPageを更新することで、画面遷移を管理する。
コンストラクタ内で
Notificationsクラスとか作って、画面遷移用のパラメータは一元管理しておく。
▼/ViewModel/Page1ViewModel.cs
→Page1.xaml用のViewModel。Page2に遷移するためのコマンドを持つ。
だけど、このままだと、どのページからどこにMessengerを送っているのかが管理できなくなるので、そのための対応もできる、らしい。
まだそこまでは理解できていないんです。
ぶっちゃけ、まだよくわからんけど、なぜか動く。
使用しているライブラリは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を送っているのかが管理できなくなるので、そのための対応もできる、らしい。
まだそこまでは理解できていないんです。