WPF ListView:附加一个双击(在一个项目上)事件

我有以下ListView

 <ListView Name="TrackListView"> <ListView.View> <GridView> <GridViewColumn Header="Title" Width="100" HeaderTemplate="{StaticResource BlueHeader}" DisplayMemberBinding="{Binding Name}"/> <GridViewColumn Header="Artist" Width="100" HeaderTemplate="{StaticResource BlueHeader}" DisplayMemberBinding="{Binding Album.Artist.Name}" /> </GridView> </ListView.View> </ListView> 

我怎样才能把一个事件附加到双击该项目的每个绑定项目?

从这里find解决scheme: http : //social.msdn.microsoft.com/Forums/en-US/wpf/thread/3d0eaa54-09a9-4c51-8677-8e90577e7bac/


XAML:

 <UserControl.Resources> <Style x:Key="itemstyle" TargetType="{x:Type ListViewItem}"> <EventSetter Event="MouseDoubleClick" Handler="HandleDoubleClick" /> </Style> </UserControl.Resources> <ListView Name="TrackListView" ItemContainerStyle="{StaticResource itemstyle}"> <ListView.View> <GridView> <GridViewColumn Header="Title" Width="100" HeaderTemplate="{StaticResource BlueHeader}" DisplayMemberBinding="{Binding Name}"/> <GridViewColumn Header="Artist" Width="100" HeaderTemplate="{StaticResource BlueHeader}" DisplayMemberBinding="{Binding Album.Artist.Name}" /> </GridView> </ListView.View> </ListView> 

C#:

 protected void HandleDoubleClick(object sender, MouseButtonEventArgs e) { var track = ((ListViewItem) sender).Content as Track; //Casting back to the binded Track } 

没有内存泄漏,工作正常:

XAML:

 <ListView ItemsSource="{Binding TrackCollection}" MouseDoubleClick="ListView_MouseDoubleClick" /> 

C#:

  void ListView_MouseDoubleClick(object sender, MouseButtonEventArgs e) { var item = ((FrameworkElement) e.OriginalSource).DataContext as Track; if (item != null) { MessageBox.Show("Item's Double Click handled!"); } } 

在你的例子中,你是否试图捕捉ListView中的项目被选中,或者当列标题被点击? 如果它是前者,你会添加一个SelectionChanged处理程序。

 <ListView Name="TrackListView" SelectionChanged="MySelectionChanged"> 

如果是后者,则必须在GridViewColumn项上使用MouseLeftButtonUp或MouseLeftButtonDown事件的某种组合来检测双击并采取适当的操作。 或者,你可以处理GridView上的事件,并从那里得到哪个列标题是在鼠标下。

我的解决scheme是基于@ epox_sub的答案 ,你应该看看在哪里把事件处理程序放在XAML中。 代码隐藏没有为我工作,因为我的ListViewItems是复杂的对象。 @ sipwiz的答案是一个很好的暗示,在哪里看…

void ListView_MouseDoubleClick(object sender, MouseButtonEventArgs e) { var item = ListView.SelectedItem as Track; if (item != null) { MessageBox.Show(item.ToString()+" Double Click handled!"); } }

这个奖金是你得到SelectedItem的DataContext绑定(在这种情况下Track )。 所选项目的作品,因为第一次点击双击select它。

基于epox_spb的答案 ,我添加了一个检查,以避免错误,当双击GridViewColumn头。

 void ListView_MouseDoubleClick(object sender, MouseButtonEventArgs e) { var dataContext = ((FrameworkElement)e.OriginalSource).DataContext; if (dataContext is Track) { MessageBox.Show("Item's Double Click handled!"); } }