MVVMの理解1(C#)

2013年1月3日木曜日

c# visualstudio2012

t f B! P L
なんでも、WPFではMVVMがよく使われるらしいので、自分なりの理解のめも。
ぶっちゃけ、まだよくわからんけど、なぜか動く。



使用しているライブラリは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を送っているのかが管理できなくなるので、そのための対応もできる、らしい。
まだそこまでは理解できていないんです。

QooQ