2013-05-22 65 views
7

Przed zaznaczyć ty na to pytanie jako duplikat lub zaproponować użyciu Items.IndexOf, wykonaj następujące czynności:Jak zdobyć indeksy wybranych elementów w polu listy 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()); 
} 

Następnie kliknij dwukrotnie czwarty element (dostaniesz 0 zamiast 3).

Jak uzyskać listę wybranych indeksów pozycji?

+1

Po wielu zamieszanie, (które jestem pewny, że dzielisz się). Myślę, że to, co się dzieje, to uzyskanie pierwszego indeksu obiektu 'A', który wynosi 0. Można utworzyć pętlę, aby uzyskać wszystkie indeksy' A' – Sayse

+1

@ Sayse: masz rację - 'ListBox' wykryje pierwszy indeks (również, jeśli klikniesz na czwarty element, często pierwszy i czwarty element będą podświetlane). Wysłałem do tego rozwiązanie na [to pytanie] (http://stackoverflow.com/questions/5469700/listview-selecting-single-item-wpf/5470094#5470094). –

+0

@DanPuzey - Twoje rozwiązanie prawdopodobnie będzie również odpowiedzią na to pytanie. – Sayse

Odpowiedz

3

Spowodowane jest Ci dodawanie tego samego obiektu na liście dwukrotnie. Kontrolka ListBox nie może między nimi określić. Jednym ze sposobów obejścia tego problemu jest owinąć każdy element w innej klasy:

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

... co oznacza, że ​​każda pozycja na liście jest wyjątkowy, choć pozycja oni zawijania nie może być. Zauważ, że wszelkie szablony danych lub powiązania również musiałyby zostać zmienione, aby to wspierać, ale możesz to zrobić z pojedynczym globalnym DataTemplate.

WrappedThing będzie wyglądać mniej więcej tak:

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

    public T Thing { get; private set; } 
} 

(. Uwaga: ten jest kopiowany z moją odpowiedź na inne pytanie here ponieważ odpowiedź jest przydatna ale pytanie jest nieco inny)

3

nawiązaniu do mojego komentarza (”robi się pierwszy indeks Object która jest 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

Uwaga: nie zamierzam tego traktować jako odpowiedzi na zadane pytanie, ale dalsze wyjaśnienia – Sayse