WPF ListView: joindre un événement double-clic (sur un élément)

J’ai le ListView suivant:

         

Comment puis-je joindre un événement à chaque object lié qui se déclenche en double-cliquant sur l’élément?

J’ai trouvé la solution ici: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/3d0eaa54-09a9-4c51-8677-8e90577e7bac/


XAML:

            

C #:

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

Aucune fuite de mémoire, fonctionne bien:

XAML:

  

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

Dans votre exemple, essayez-vous d’attraper un élément de votre ListView ou de cliquer sur un en-tête de colonne? Si c’est le premier, vous appendiez un gestionnaire SelectionChanged.

  

Si c’est le dernier, vous devrez utiliser une combinaison d’événements MouseLeftButtonUp ou MouseLeftButtonDown sur les éléments GridViewColumn pour détecter un double clic et prendre les mesures appropriées. Sinon, vous pouvez gérer les événements sur le GridView et trouver l’en-tête de colonne sous la souris.

Pour ceux qui sont intéressés par le maintien du modèle MVVM, j’ai utilisé la réponse d’Andreas Grech pour faire le point.

Flux de base:

L’utilisateur double-clique sur l’élément -> Gestionnaire d’événements dans le code -> ICommand dans le modèle de vue

ProjectView.xaml:

    ...  

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 Projects { get; set; } = new ObservableCollection(); public ProjectViewModel() { //Add items to Projects } public ICommand ProjectClick { get { return new DelegateCommand(new Action(OpenProjectInfo)); } } private void OpenProjectInfo(object _project) { ProjectDetailView project = new ProjectDetailView((Project)_project); project.ShowDialog(); } } 

DelegateCommand.cs peut être trouvé ici .

Dans mon cas, j’ai une collection d’objects Project qui ListView . Ces objects contiennent plus de propriétés que celles affichées dans la liste et j’ouvre un ProjectDetailView (une Window WPF) pour les afficher.

L’object sender du gestionnaire d’événements est le ListViewItem sélectionné. Par la suite, le Project auquel je souhaite accéder est contenu dans la propriété Content .

Ma solution était basée sur la réponse de @ epox_sub que vous devriez examiner pour savoir où placer le gestionnaire d’événements dans XAML. Le code-behind ne fonctionnait pas pour moi car mes ListViewItems sont des objects complexes. La réponse de @ sipwiz était un excellent indice pour savoir où chercher …

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

Le bonus avec ceci est que vous obtenez la liaison DataContext du SelectedItem ( Track dans ce cas). L’élément sélectionné fonctionne car le premier clic du double-clic le sélectionne.

En s’appuyant sur la réponse de epox_spb , j’ai ajouté un chèque pour éviter les erreurs en double-cliquant sur les en-têtes 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!"); } }