如果按住列表框,我想获得列表框索引。
这是我的代码:
<ListBox Margin="0,0,-12,0"
Hold="holdlistbox"
x:Name="listbox"
SelectionChanged="listbox_SelectionChanged"
SelectedIndex="-1">
</ListBox>
private void holdlistbox(object sender, System.Windows.Input.GestureEventArgs e)
{
//How to get ListBox index here
}
如果有人知道帮我做这件事。
答案 0 :(得分:12)
e.OriginalSource将为您提供实际控制权(直接在您手指下的最顶层控件)。根据您的ItemTemplate和您所在的位置,这可能是项目中的任何控件。然后,您可以检查此控件的DataContext以获取绑定到该项的对象(通过您的注释,这将是一个ItemViewModel对象):
FrameworkElement element = (FrameworkElement)e.OriginalSource;
ItemViewModel item = (ItemViewModel)element.DataContext;
然后,您可以在items集合中获取此项目的索引:
int index = _items.IndexOf(item);
如果要获取ListBoxItem本身,则需要使用VisualHelper类来搜索父层次结构。这是一个我用来执行此操作的enxtension方法:
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,如果没有,则需要在父层次结构中搜索不同的控件。
答案 1 :(得分:1)
var selectedIndex = (sender as ListBox).SelectedIndex;