如何在Listbox中实现Hold?

时间:2011-11-25 12:37:53

标签: windows-phone-7 listbox selectedindex tapandhold

如果按住列表框,我想获得列表框索引。

这是我的代码:

<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 个答案:

答案 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;