導入
WPFで一覧を表示する定番の組み合わせが、ListBox(やComboBox/DataGrid)の**ItemsSourceと、ViewModelが持つObservableCollection<T>**です。ItemsSourceにコレクションをバインドすると、コレクションの中身がそのまま一覧として描画されます。まずはこの土台だけを、実際に手を動かして確認しましょう。
説明
flowchart LR
LB["ListBox(View)<br/>ItemsSource={Binding Tasks}<br/>DisplayMemberPath=Title"] --> OC["ObservableCollection<TaskDto><br/>Tasks(ViewModel)"]
OC -.CollectionChanged.-> LB
ItemsSource="{Binding Tasks}"で、ViewModelのTasks(ObservableCollection<TaskDto>)を一覧の元データにするDisplayMemberPath="Title"で、各要素のどのプロパティを表示するかを指定する(第6章のrecordの位置引数がそのままプロパティ名になる)List<T>ではなくObservableCollection<T>を使う理由は、要素が増減したときに自動で画面へ通知が飛び、一覧の再描画が自動で起きるから(レッスン21の復習)
やってみよう
下の実行ウィジェットには、まだTasksへ要素を追加する手段(ボタン)がありません。次のレッスンで追加機能をつなぐ前に、まずは「空のコレクションが正しくListBoxに接続されている」ことと、XAMLの各属性の役割を確認しましょう。
- 右のプレビューで
ListBoxが(空のまま)表示されていることを確認する DisplayMemberPath="Title"をDisplayMemberPath="IsCompleted"に書き換えて保存し、プレビューが再描画されることを確認する(一覧は空なので見た目の差は出ないが、エラーにならないことがわかる)HeightやMarginの数値を変えて、レイアウトが変わることを確認する
確認ポイント
ItemsSourceがTasks(ObservableCollection<TaskDto>)を指していることDisplayMemberPathで表示するプロパティ名を指定できること- XAMLを書き換えるとプレビューが再描画されること
まとめ
ListBoxのItemsSourceにコレクションをバインドすると一覧表示になるDisplayMemberPathで「どのプロパティを表示するか」を指定するObservableCollection<T>は増減のたびに画面へ自動通知する(List<T>にはできない)
次回: TextBoxとCommandをつないで、実際にタスクを追加できるようにします。