2010-02-24 2 views
4

동료 프로그램을 디버깅하고 WPF에서이 문제를 해결했습니다.WPF Listbox.selecteditems는 선택된 순서대로 항목을 반환합니다.

listBoxName.SelectedItems는 사용자가 인터페이스에서 항목을 선택하는 순서대로 선택한 항목의 목록을 반환합니다. 실제 주문을 보존해야하기 때문에 문제가됩니다.

예 :

목록 상자가 확장를 SelectMode에 내 목록 상자가 뭔가를 포함 runfirst, runsecond, 사용자는 그들이 목록 상자에서 기반으로 실행하려면 원하는 것을 선택할 수있는 옵션이 제공됩니다

을 runthird. 그들은 runthirst를 선택한 다음 runfirst를 선택합니다. 이것은 runthird를 목록의 맨 위에 표시 한 다음 runfirst로 표시합니다. foreach를 실행하기 전에 목록을 정렬 할 수 있다고 생각하지만 더 쉬운 방법이 있는지 궁금해하고있었습니다.

감사합니다.

+0

내가 생각하는 도움들에 대한

 foreach (<yourobject> item in listForSelection.Items) { if (listForSelection.SelectedItems.Contains(item)) { \\code here } } 

덕분에 다음과 같이 들어있는 목록 상자에서 모든 항목 반복 결국 다음 확인 당신 말이 맞지만 ListBox를 채우는 목록을 정렬 한 다음 처리하기 전에 SelectedItem을 정렬해야합니다. – Dave

답변

3

그래 나는

+0

엄청난 양의 항목이 있지만 선택 항목이 많지 않을 경우 느려질 수 있습니다. –

1

나는 당신이 질문에 답을 주었다고 생각합니다.

대부분의 경우 선택한 항목의 순서는 중요하지 않습니다. 그것이 당신을 위해하기 때문에, 그들을 처리하기 전에 선택한 항목을 정렬하는 것이 가장 간단한 해결책 인 것 같습니다. 나는 정말로 더 간단한 것을 생각할 수 없다. 특히 정렬이 오직 하나의 라인을 추가해야 할 때 더욱 그렇다.

원본 목록을 정렬하는 데 사용 된 동일한 Comparison<T> 또는 IComparer<T>을 사용할 수 있습니다. SelectedItems에 바인딩하는 경우 IValueConverter을 사용하여 정렬 할 수 있습니다.

+0

정렬에 대한 조언을했습니다. – Locke12

9

내가 한 것은 LINQ를 사용하여 선택한 항목을 인덱스 순서로 반환하는 것이 었습니다. VB.Net 구문이지만 C#을 수정하기 쉽습니다. 그것을 사용 selectedItems를에 있다면

Dim selecteditems = From selecteditem As ListBoxItem In ListBox1.SelectedItems _ 
        Select selecteditem _ 
        Order By ListBox1.Items.IndexOf(selecteditem) 
+0

아마도 링크를 사용하면 효과가 있었을 것입니다. – Locke12

관련 문제