Как реализовать Hold в Listbox?
Если держать список, я хочу получить индекс списка.
Это мой код:
<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
}
Если кто-нибудь знает, помогите мне сделать это.
2 ответа
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, если нет, то вам нужно искать другой элемент управления в родительской иерархии.