4

リストボックスを保持している場合、リストボックスのインデックスを取得したい。

これは私のコードです:

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

誰かが知っていれば、これを行うのを手伝ってください。

4

2 に答える 2

12

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

于 2011-11-25T19:29:04.883 に答える
1

var selectedIndex = (sender as ListBox).SelectedIndex;

于 2011-11-25T12:47:52.620 に答える