Q118. ListBox の項目にボタンを表示し、ビューモデルのコマンドとバインドさせたい

A.DataTemplete を使ってリストボックスの項目表示をカスタマイズし、コマンドをバインドします。

DataTemplete は XAML 系アプリケーションならではの機能で、Windows Forms では実現不可能な極めて柔軟なインターフェイスを提供します。以下、MSDNの関連記事です。

データ テンプレートの概要


以下サンプルを用意しました。リストボックスの項目をボタンに変更し、クリックすると詳細をダイアログで表示する簡単なアプリです。なお MVVMインフラは Livet を使用しました。コードは C#VB の両方を用意しています。


まずモデルを用意します。IDと名前・年齢だけ保持する簡単なクラスです。


次は ViewModel です。ViewModel はモデルのコレクションをコンストラクタで生成し保持します。さらに選択されたPersonの内容を表示するコマンドを提供します。


最後は View ですが、DataTemplate で Button を表示するよう設定してます。Button は ViewModel のコマンドとバインドするよう、RelativeSource を使って Window.DataContext まだ遡るようにしています。またボタンクリック等のフォーカス遷移時に項目が選択されるよう、IsKeyboardFocusWithin = True 時にトリガーを走らせ項目が選択されるようにしました。


以上、何かの参考になれば幸いです。


WPF FAQ の目次に戻る