Как реализовать Hold в Listbox? - PullRequest
4 голосов
/ 25 ноября 2011

Если удерживать список, я хочу получить индекс списка.

Это мой код:

<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 ]

12 голосов
/ 25 ноября 2011

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, если нет, то вам нужно искать другой элемент управления в родительской иерархии.

1 голос
/ 25 ноября 2011

var selectedIndex = (sender as ListBox).SelectedIndex;

...