Hatena::ブログ(Diary)

present このページをアンテナに追加 RSSフィード Twitter

2010-03-17

ダブルクリックされた ListView の項目を取得する方法

データバインディングを使って ListView にデータを表示した状態で、ListView の項目がダブルクリックされたとき、その項目を取得するには ListViewItem の MouseDoubleClick イベントをハンドルすればいい。イベントハンドラの設定は、スタイルを使ってまとめて設定すると楽。

<ListView ItemsSource="{Binding Path=People}">
    <ListView.Resources>
        <Style TargetType="{x:Type ListViewItem}">
            <EventSetter Event="MouseDoubleClick" Handler="ListView_MouseDoubleClick"/>
        </Style>
    </ListView.Resources>

    <!-- ビューは省略 -->
</ListView>
private void ListView_MouseDoubleClick(object sender, MouseEventArgs e)
{
    // sender がダブルクリックされた項目
    ListViewItem targetItem = (ListViewItem)sender;

    // データバインディングを使っているなら、
    // DataContext からデータを取得できる
    Person p = (Person)targetItem.DataContext;
}

antskantsk 2010/03/19 14:06 ContainerFromElementというのがあるので各Itemにイベント設定しなくてもできますよ。
たぶんルーティングイベントってこういうのをやるための仕組みだと思います。
.xaml
  <ListView MouseDoubleClick="ListView_MouseDoubleClick"
    ItemsSource="{Binding People}" />

.cs
  private void ListView_MouseDoubleClick(object sender, MouseButtonEventArgs e)
  {
    var listView = (ListView)sender;
    var item = listView.ContainerFromElement((DependencyObject)e.OriginalSource) as ListViewItem;
    if (item != null)
    {
      var person = (Person)item.DataContext;
      MessageBox.Show(person.Name);
    }
    else
    {
      MessageBox.Show("余白とかヘッダ部分");
    }
  }

griefworkergriefworker 2010/03/21 07:57 >antskさん
こんな便利なメソッドがあったんですね。知りませんでした。
情報ありがとうございます。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/griefworker/20100317/listview_item_mouse_double_click