2013-05-22 2 views
7

Перед тем, как отметить этот вопрос как дубликат или предлагают использовать Items.IndexOf, пожалуйста, сделайте следующее:Как получить индексы выбранных элементов в списке 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()); 
} 

Затем дважды щелкните четвертый элемент (вы получите 0 вместо 3).

Как получить список выбранных элементов?

+1

После долгих путаница (я уверен, что ваш обмен). Я думаю, что происходит то, что он получает первый индекс объекта 'A', который равен 0. Вы можете создать цикл, чтобы получить все индексы' A' – Sayse

+1

@Sayse: вы правы - 'ListBox' подберет первый индекс (также, если вы нажмете на четвертый элемент, часто будут выделены как первый, так и четвертый элементы). Я разместил решение для этого на [этот вопрос] (http://stackoverflow.com/questions/5469700/listview-selecting-single-item-wpf/5470094#5470094). –

+0

@DanPuzey - Ваше решение, вероятно, также будет ответом на этот вопрос. – Sayse

ответ

3

Это вызвано вы добавив тот же объект в списке дважды. Элемент управления ListBox не может определить между ними. Один из способов решения этой проблемы является, чтобы обернуть каждый элемент в другом классе:

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

... что означает, что каждый элемент в списке является уникальным, даже если деталью они оберточная не может быть. Обратите внимание, что любой шаблон данных или привязки также должны были бы измениться для поддержки этого, хотя вы могли бы сделать это с помощью одного глобального DataTemplate.

WrappedThing будет выглядеть примерно так:

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

    public T Thing { get; private set; } 
} 

(Примечание:. Это копируется из моего ответа на другой вопрос here поскольку ответ полезен, но вопрос немного отличается)

3

Далее на мой комментарий (»его получение первого индекса объекта А, который является 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

Примечание: Я не собираюсь это рассматривать как ответ на заданный вопрос, но дальнейшее разъяснение – Sayse

Смежные вопросы