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 時にトリガーを走らせ項目が選択されるようにしました。
以上、何かの参考になれば幸いです。