2013-05-22 15 views
7

Prima di contrassegnare questa domanda come un duplicato o suggerire utilizzando Items.IndexOf, si prega di effettuare le seguenti operazioni:Come ottenere indici di articoli selezionati nella casella di riepilogo di WPF?

public MainWindow() 
{ 
    InitializeComponent(); 

    var A = new object(); 
    var B = new object(); 
    var C = new object(); 

    lbItems.Items.Add(A); 
    lbItems.Items.Add(B); 
    lbItems.Items.Add(C); 
    lbItems.Items.Add(A); 
    lbItems.Items.Add(B); 
    lbItems.Items.Add(C); 
} 

private void lbItems_MouseDoubleClick(object sender, MouseButtonEventArgs e) 
{ 
    MessageBox.Show(lbItems.Items.IndexOf(lbItems.SelectedItems[0]).ToString()); 
} 

quindi doppio quarto elemento (si otterrà 0 invece di 3).

Come ottenere un elenco di indici di articoli selezionati?

+1

Dopo tanto confusione, (che sono sicuro che la tua condivisione). Penso che stia succedendo sta ottenendo il primo indice dell'oggetto 'A' che è 0. Potresti creare un ciclo per ottenere tutti gli indici di' A' – Sayse

+1

@Sayse: sei corretto - il 'ListBox' prenderà il primo indice (Inoltre, se clicchi sul quarto elemento, saranno spesso evidenziati sia il primo che il quarto elemento). Ho pubblicato una soluzione per questo su [questa domanda] (http://stackoverflow.com/questions/5469700/listview-selecting-single-item-wpf/5470094#5470094). –

+0

@DanPuzey - La tua soluzione sarebbe probabilmente anche la risposta a questa domanda. – Sayse

risposta

3

Questo è causato da voi aggiungendo lo stesso oggetto alla lista due volte. Il controllo ListBox non può distinguere tra loro. Un modo per aggirare questo problema è quello di avvolgere ogni elemento in un'altra classe:

lbItems.Items.Add(new WrappedThing((a)); 
lbItems.Items.Add(new WrappedThing((b)); 
lbItems.Items.Add(new WrappedThing((a)); 
lbItems.Items.Add(new WrappedThing((b)); 

... il che significa che ogni elemento della lista è unica, anche se la voce che stanno avvolgendo non può essere. Si noti che qualsiasi modello di dati o associazioni dovrebbe anche cambiare per supportare questo, anche se si potrebbe fare questo con un singolo globale DataTemplate.

WrappedThing sarebbe simile a questa:

class WrappedThing<T> 
{ 
    public WrappedThing(T thing) 
    { 
     Thing = thing; 
    } 

    public T Thing { get; private set; } 
} 

(Nota:. Questo viene copiato da mia risposta a una domanda diversa here dal momento che la risposta è utile, ma la questione è leggermente diversa)

3

seguito al mio commento (" il suo ricevendo il primo indice dell'oggetto A che è 0"),

int j = 0; 
for (int i = 0; i < lbItems.Items.Count; i++) 
{ 
    if (lbItems.Items[i] == lbItems.SelectedItems[0]) 
     j++; 
} 
MessageBox.Show(lbItems.Items.IndexOf(lbItems.SelectedItems[0]).ToString() 
+ string.Format("\r\nThere are {0} occurences of this object in this list", j)); 
+0

Nota: non intendo ciò come una risposta alla domanda posta, ma ulteriori chiarimenti – Sayse

Problemi correlati