e.OriginalSource 将为您提供所持有的实际控件(您手指正下方的最顶层控件)。根据您的 ItemTemplate 和您持有的位置,这可能是项目中的任何控件。然后,您可以检查此控件的 DataContext 以获取绑定到该项目的对象(根据您的注释,这将是一个 ItemViewModel 对象):
FrameworkElement element = (FrameworkElement)e.OriginalSource;
ItemViewModel item = (ItemViewModel)element.DataContext;
然后,您可以在 items 集合中获取该项目的索引:
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,如果没有,则需要在父层次结构中搜索不同的控件。