導入
第6章までで、TaskListViewModelは既に「一覧を持つ」「タイトルを入力できる」「追加を実行できる」という振る舞いを、画面なしでテストだけを頼りに完成させました。残っているのは、このViewModelを実際のWPFの画面(View)につなぐことだけです。MVVMのViewは、それ自体は驚くほど何もしません。
説明
flowchart LR
U["ユーザー操作"] --> W["Window(View)<br/>XAML"]
W <-->|"DataContext<br/>{Binding}"| VM["TaskListViewModel"]
VM --> SVC["TaskService"]
SVC --> REPO["ITaskRepository"]
ViewとViewModelを結びつけるのがDataContextです。Window(や任意の要素)のDataContextにViewModelのインスタンスを渡すと、XAML側の{Binding プロパティ名}がそのインスタンスのプロパティを指すようになります。
<Window x:Class="MyApp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="タスク管理">
<!-- ここから先はDataContext(TaskListViewModel)のプロパティ/Commandへバインドするだけ -->
</Window>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
// DataContext にViewModelのインスタンスを渡すと {Binding} が有効になる
var repository = new InMemoryTaskRepository();
var service = new TaskService(repository);
DataContext = new TaskListViewModel(service);
}
}
- コードビハインド(
MainWindow.xaml.cs)に書くのはDataContextを設定する数行だけ。クリックイベントのハンドラや業務ロジックは一切書かない - ここでの依存の組み立て方(
new InMemoryTaskRepository()からnew TaskListViewModel(service)まで手でnewする)は、第8章で学ぶComposition Rootの考え方そのもの。今は「起動時にViewModelを1つ作ってDataContextへ渡す」という最小形で十分 - 次のレッスンからは、ブラウザの
<mvvm-runner>がDataContextの配線を代わりに行ってくれるので、皆さんはXAMLとViewModelのコードだけを書けばよい
まとめ
- Viewの仕事は「表示する」ことと「ユーザー操作をViewModelへ伝える」ことだけ。業務ロジックは一切持たない
- コードビハインドは
DataContextを設定する以外、空にする - 依存をどこでどう組み立てるか(Composition Root)は第8章で詳しく扱う
次回: いよいよ<mvvm-runner>で、Tasksの一覧をXAMLに表示します。