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