2010-11-15 12 views
5

Ho una lista con un semplice elenco di elementi. Sulla mia pagina di XAML, ho il seguentesilverlight/windows phone 7 selectedIndex problemi con pulsante all'interno 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> 

Nel mio codebehind, cerco di afferrare il selectedIndex in modo da poter rimuovere l'elemento della collezione che è legato alla mia casella di riepilogo.

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); 

     } 

Tuttavia, non importa su quale riga si fa clic sul pulsante Elimina, selectedIndex è sempre -1

cosa mi manca?

grazie in anticipo!

risposta

6

si può fare quello che vuoi impostando la proprietà Tag del pulsante per il vostro oggetto come questo:

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

Poi nel EventHandler si può fare questo:

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

non sono sicuro che l'oggetto è chiamato quindi non ho gettato il tag ad esso, ma probabilmente avere a che fare, ma sembra che hai dimestichezza con questo.


Esiste un mancante StackPanel iniziare elemento nel XAML? Questa è probabilmente solo una svista, ma potrebbe causare alcuni problemi se questo è il tuo codice reale.

+0

questa risposta è stata piuttosto utile. Cosa succede se non desidero allegare un intero oggetto al tag? cosa succede se voglio solo allegare un numero..say..ilIndex selezionato? – Dave

+1

Eviterei di usare l'indice (sia perché è più difficile da fare che meno flessibile man mano che il codice cambia). Puoi aggiungere una proprietà ID (qualcosa di unico) al tuo oggetto personalizzato e associare il tag a questo. Quindi è possibile scorrere l'elenco e rimuoverlo in base a questo ID o utilizzare un dizionario con la chiave impostata su tale ID. – theChrisKent

1

Il pulsante sta catturando l'evento tocco (clic) in modo che l'elemento non venga mai selezionato.

Invece di utilizzare SelectedIndex, è necessario determinare quale elemento eliminare in base al pulsante su cui è stato fatto clic. (A tale scopo, guardando il sender passato al gestore di eventi.)

2

Il mittente sarà il pulsante di aver fatto clic, la sua DataContext sarà l'elemento che si desidera eliminare e un tipico List implementazione avrà un metodo Remove . Quindi, qualcosa di simile potrebbe funzionare nel caso generale: -

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

So che hai una risposta, ma questo è ancora un altro modo di fare ciò che chiedi. Puoi anche utilizzare la proprietà selecteditem

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); 

    }