WPF ListView: collegamento di un evento doppio clic (su un elemento)

Ho il seguente ListView :

         

Come posso albind un evento a ogni object rilegato che si triggers facendo doppio clic sull’elemento?

Trovato la soluzione da qui: 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 } 

Nessuna perdita di memoria, funziona bene:

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

Nel tuo esempio stai cercando di catturare quando viene selezionato un object in ListView o quando si fa clic su un’intestazione di colonna? Se è il primo, si aggiunge un gestore SelectionChanged.

  

Se è il secondo, è necessario utilizzare una combinazione di eventi MouseLeftButtonUp o MouseLeftButtonDown sugli elementi GridViewColumn per rilevare un doppio clic e adottare le misure appropriate. In alternativa è ansible gestire gli eventi sul GridView e calcolare da lì quale intestazione della colonna era sotto il mouse.

Per coloro che erano interessati a mantenere per lo più il pattern MVVM, ho usato la risposta di Andreas Grech per risolvere il problema .

Flusso di base:

L’utente fa doppio clic sull’elemento -> Gestore eventi nel codice sottostante -> ICommand in view model

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 può essere trovato qui .

Nella mia istanza, ho una collezione di oggetti Project che popolano il ListView . Questi oggetti contengono più proprietà di quelle mostrate nell’elenco e apro un ProjectDetailView (una Window WPF) per visualizzarle.

L’object sender del gestore eventi è l’object ListViewItem selezionato. Successivamente, il Project cui voglio accedere è contenuto all’interno della proprietà Content .

La mia soluzione era basata sulla risposta di @ epox_sub che dovresti cercare dove inserire il gestore di eventi in XAML. Il code-behind non ha funzionato per me perché i miei oggetti ListViewItems sono complessi. La risposta di @ sipwiz è stata un’ottima indicazione su dove cercare …

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

Il bonus con questo è che ottieni il binding DataContext di SelectedItem ( Track in questo caso). L’elemento selezionato funziona perché il primo clic del doppio clic lo seleziona.

Basandosi sulla risposta di epox_spb , ho aggiunto un controllo per evitare errori quando si fa doppio clic nelle intestazioni di 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!"); } }