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!"); } }