本文へスキップ
BecomeCoder

C# MVVMコース · 第7章 View ― WPFへ接続する · レッスン25

Viewの役割とDataContext ― コードビハインドを空にする

ローカル実施

導入

第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に表示します。