2010-11-15 26 views
5

Tengo un cuadro de lista con una simple lista de elementos. En mi página XAML, Tengo el siguientesilverlight/windows phone 7 selectedIndex problemas con el botón dentro de listbox

<ListBox Name="listBox1"> 
         <ListBox.ItemTemplate> 
          <DataTemplate> 
            <TextBlock Text="{Binding firstName}"/> 
            <TextBlock Text="{Binding lastName}"/> 
            <Button BorderThickness="0" Click="buttonPerson_Click"> 
             <Image Source="delete-icon.png"/> 
            </Button> 
           </StackPanel> 
          </DataTemplate> 
         </ListBox.ItemTemplate> 
        </ListBox> 

En mi código subyacente, trato de agarrar el selectedIndex para que pueda quitar el elemento de la colección que se une a mi cuadro de lista.

private void buttonPerson_Click(object sender, RoutedEventArgs e) 
     { 

      // If selected index is -1 (no selection) do nothing 
      if (listBox1.SelectedIndex == -1) 
       return; 

      myPersonList.removeAt(listBox1.SelectedIndex); 

     } 

Sin embargo, no importa en qué fila que haga clic en el botón de borrar, selectedIndex es siempre -1

lo que me estoy perdiendo?

gracias de antemano!

Respuesta

6

Usted puede hacer lo que desee mediante el establecimiento de la propiedad Tag del botón a su objeto como éste:

<Button BorderThickness="0" Click="buttonPerson_Click" Tag="{Binding BindsDirectlyToSource=True}"> 
    <Image Source="delete-icon.png"/> 
</Button> 

Luego, en el manejador de sucesos usted puede hacer esto:

private void buttonPerson_Click(object sender, RoutedEventArgs e) 
{ 
    myPersonList.remove((sender as Button).Tag); 
} 

no está seguro de cuál es su objeto persona es llamada así que no había desechado la etiqueta a ella, pero probablemente tendrá que hacer eso, pero parece que está cómodo con eso.


¿Hay una falta StackPanel comenzar elemento en su XAML? Esto es probablemente solo un descuido, pero podría causarle algunos problemas si este es su código real.

+0

esta respuesta ha sido muy útil. ¿Qué pasa si no quiero adjuntar un objeto completo a la etiqueta? ¿Qué pasa si solo quiero adjuntar un número ... digamos ... el Índice seleccionado? – Dave

+1

Evitaría usar el índice (porque es más difícil de hacer y menos flexible a medida que cambia el código). Puede agregar una propiedad de ID (algo único) a su objeto personalizado y vincular la etiqueta a esto. Luego, puede recorrer la lista y eliminar según esta ID, o usar un diccionario con la clave establecida para esa ID. – theChrisKent

1

El botón está capturando el evento táctil (clic) para que el elemento nunca se seleccione.

En lugar de utilizar el SelectedIndex, debe averiguar qué elemento eliminar según el botón en el que se hizo clic. (Para ello, mirando el sender pasado al controlador de eventos.)

2

El remitente será el botón de haber hecho clic, su DataContext será el elemento que desea eliminar y un típico List aplicación tendrá un método Remove . Así que algo como esto funcionaría en el caso general: -

((IList)myPersonList).Remove(((Button)sender).DataContext); 
1

Sé que tiene una respuesta, pero esta es otra forma de hacer lo que pide. También podría utilizar la propiedad de elemento seleccionado

private void buttonPerson_Click(object sender, RoutedEventArgs e) 
{ 

     // Select the item in the listbox that was clicked 
     listBox1.SelectedItem = ((Button)sender).DataContext; 

     // If selected index is -1 (no selection) do nothing 
     if (listBox1.SelectedItem == null) 
      return; 

     // Cast you bound list datatype. 
     myPersonList.remove(([myPersonList Type])listBox1.SelectedValue); 

    }