tags:

views:

631

answers:

3

Hi,

i have a listbox with a data template that contains a button.

When the button is clicked I want to get in the button click handler the index of the listbox item that was current??

How do I do this please?

Malcolm

+1  A: 

Hope the bellow code will help you.

private void Button_Click(object sender, RoutedEventArgs e)
{
    var b = (Button)sender;
    var grid = (Grid)b.TemplatedParent
    var lstItem = (ListBoxItem)grid.TemplatedParent;
    int index = lstBox.ItemContainerGenerator.IndexFromContainer(lstItem);
    // rest of your code here...
}

And the XAML for the above assumed to be a DataTemplate on a ListBox named lstBox:

<DataTemplate x:Key="template">
  <Grid>
    <Button Click="Button_Click" Content="Press"/>
  </Grid>
</DataTemplate>
Jobi Joy
The idea works but this code is somewhat brittle in that it assumes there will always be two hops from the `Button` up to the `ListBoxItem`.
Drew Noakes
+2  A: 

More appropriate answer,

private void Button_Click(object sender, RoutedEventArgs e)
{
   DependencyObject dep = (DependencyObject)e.OriginalSource;

   while ((dep != null) && !(dep is ListViewItem))
   {
     dep = VisualTreeHelper.GetParent(dep);
   }

   if (dep == null)
    return;

   int index = lstBox.ItemContainerGenerator.IndexFromContainer(dep); 
}
Jobi Joy
A: 

Have you checked the "SelectedIndex" property of the listbox? It might be set by clicking on the button.

Jay