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 にアタッチされていることを前提としています。そうでない場合は、親階層で別のコントロールを検索する必要があります。