e.OriginalSource даст вам фактический элемент управления, который был удержан (самый верхний элемент управления прямо под вашим пальцем).В зависимости от вашего ItemTemplate и того, где вы держите, это может быть любой элемент управления в элементе.Затем вы можете проверить DataContext этого элемента управления, чтобы получить объект, связанный с этим элементом (по вашему комментарию это будет объект ItemViewModel):
FrameworkElement element = (FrameworkElement)e.OriginalSource;
ItemViewModel item = (ItemViewModel)element.DataContext;
Затем вы можете получить индекс этого элементав коллекции элементов:
int index = _items.IndexOf(item);
Если вы хотите получить сам ListBoxItem, вам нужно будет использовать класс VisualHelper для поиска родительской иерархии.Вот метод расширения, который я использую для этого:
public static T FindVisualParent<T>(this DependencyObject obj) where T : DependencyObject
{
DependencyObject parent = VisualTreeHelper.GetParent(obj);
while (parent != null)
{
T t = parent as T;
if (t != null)
{
return t;
}
parent = VisualTreeHelper.GetParent(parent);
}
return null;
}
Я не уверен, что вам это нужно (я не был уверен в вашем комментарии), но вы можете сделать следующее, чтобы получитьконтекстное меню:
FrameworkElement element = (FrameworkElement)e.OriginalSource;
ListBoxItem listItem = element.FindVisualParent<ListBoxItem>();
ContextMenu contextMenu = ContextMenuService.GetContextMenu(listItem);
Предполагается, что ContextMenu присоединено к ListBoxItem, если нет, то вам нужно искать другой элемент управления в родительской иерархии.