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>
Как я могу прикрепить событие к каждому связанному элементу, который будет срабатывать при двойном щелчке элемента?
6 ответов:
нашел решение отсюда: 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">если это последнее, вам придется использовать некоторую комбинацию событий MouseLeftButtonUp или MouseLeftButtonDown в элементах GridViewColumn, чтобы обнаружить двойной щелчок и предпринять соответствующие действия. Кроме того, вы можете обрабатывать события на GridView и позаниматься там заголовок столбца находился под мышкой.
для тех, кто заинтересован в основном поддержании шаблона MVVM, я использовал ответ Андреаса греха чтобы сделать обход.
базовый поток:
пользователь дважды щелкает элемент - > обработчик событий в коде позади -> ICommand in вид модель
ProjectView.xaml:
<UserControl.Resources> <Style TargetType="ListViewItem" x:Key="listViewDoubleClick"> <EventSetter Event="MouseDoubleClick" Handler="ListViewItem_MouseDoubleClick"/> </Style> </UserControl.Resources> ... <ListView ItemsSource="{Binding Projects}" ItemContainerStyle="{StaticResource listViewDoubleClick}"/>ProjectView.код XAML.cs:
public partial class ProjectView : UserControl { public ProjectView() { InitializeComponent(); } private void ListViewItem_MouseDoubleClick(object sender, MouseButtonEventArgs e) { ((ProjectViewModel)DataContext) .ProjectClick.Execute(((ListViewItem)sender).Content); } }ProjectViewModel.cs:
public class ProjectViewModel { public ObservableCollection<Project> Projects { get; set; } = new ObservableCollection<Project>(); public ProjectViewModel() { //Add items to Projects } public ICommand ProjectClick { get { return new DelegateCommand(new Action<object>(OpenProjectInfo)); } } private void OpenProjectInfo(object _project) { ProjectDetailView project = new ProjectDetailView((Project)_project); project.ShowDialog(); } }DelegateCommand.cs можно найти здесь.
в моем случае, у меня есть коллекция
Projectобъекты, которые населяютListView. Эти объекты содержат больше свойств, чем показано в списке, и я открываюProjectDetailView(в WPFWindow), чтобы отобразить их.The
senderобъектом обработчика событий является выбранныйListViewItem. ВпоследствииProjectчто я хочу получить доступ к содержится вContentсобственность.
мое решение было основано на @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в данном случае). Выбранный элемент работает, потому что первый щелчок двойного щелчка выбирает его.
дом на 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!"); } }
Comments