2013-05-22 14 views
7

Bevor Sie diese Frage als Duplikat markieren oder schlagen Items.IndexOf verwenden, gehen Sie bitte wie folgt vor:Wie erhalten Sie Indizes ausgewählter Elemente in der WPF-Listbox?

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

Dann doppelklicken viertes Element (Sie werden 0 erhalten statt 3).

Wie bekomme ich eine Liste ausgewählter Item-Indizes?

+1

Nach reiflicher Verwirrung, (die ich sicher teile). Ich denke, was passiert, ist es, den ersten Index des Objekts "A" zu erhalten, der 0 ist. Sie könnten eine Schleife erstellen, um alle Indizes von "A" zu erhalten – Sayse

+1

@Sayse: Sie sind richtig - die 'ListBox' wird den ersten Index aufnehmen (Wenn Sie auf das vierte Element klicken, werden häufig sowohl das erste als auch das vierte Element hervorgehoben). Ich habe eine Lösung dafür auf [diese Frage] (http://stackoverflow.com/questions/5469700/listview-selecting-single-item-wpf/5470094#5470094) gepostet. –

+0

@DanPuzey - Ihre Lösung wäre wahrscheinlich auch die Antwort auf diese Frage. – Sayse

Antwort

3

Dies verursacht wird von Ihnen das gleiche Objekt in die Liste zweimal hinzufügen. Das Steuerelement ListBox kann nicht zwischen ihnen unterscheiden. Ein Weg, um dieses Problem ist, jedes Element in einer anderen Klasse zu wickeln:

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

... was bedeutet, dass jedes Element in der Liste ist einzigartig, auch wenn das Element sie Einwickeln kann nicht sein. Beachten Sie, dass sich auch jede Datenvorlage oder Bindungen ändern müssen, um dies zu unterstützen, obwohl Sie dies mit einem einzigen globalen DataTemplate tun könnten.

WrappedThing würde wie folgt aussehen:

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

    public T Thing { get; private set; } 
} 

(. Hinweis: aus meiner Antwort auf eine andere Frage kopiert here da die Antwort nützlich ist, aber die Frage ist etwas anders)

3

Weitere zu meinem Kommentar (“its den ersten Index des Objekts A erhalten, die 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

Hinweis: Ich beabsichtige dies nicht als Antwort auf die gestellte Frage, sondern zur weiteren Klärung – Sayse