2013-08-10 18 views
9

mam to:Sprawdź, czy ComboBox Zawiera produkt

<ComboBox SelectedValuePath="Content" x:Name="cb"> 
    <ComboBoxItem>Combo</ComboBoxItem> 
    <ComboBoxItem>Box</ComboBoxItem> 
    <ComboBoxItem>Item</ComboBoxItem> 
</ComboBox> 

Jeśli używam

cb.Items.Contains("Combo") 

lub

cb.Items.Contains(new ComboBoxItem {Content = "Combo"}) 

zwraca False.

Czy ktoś może mi powiedzieć jak mogę sprawdzić, czy ComboBoxItem nazwie Combo istnieje w ComboBoxcb?

+2

ComboBox nie ma nazw, więc jak się do niego odwołujesz? – Paparazzi

+0

Najlepiej jest umieścić kod, który odtwarza problem. – Paparazzi

+3

Jeśli szukasz prędkości, powiąż źródło z HashSet łańcucha i sprawdź, czy HashSet zawiera ciąg znaków. Jeśli potrzebujesz dynamicznych wstawień i usuwa to ObservableCollection. Używanie ComboBox jako kolekcji nie jest optymalne. – Paparazzi

Odpowiedz

12

Elementy to ItemCollection i not list of strings. W twoim przypadku jest to collection of ComboboxItem i musisz sprawdzić jego właściwość Content.

cb.Items.Cast<ComboBoxItem>().Any(cbi => cbi.Content.Equals("Combo")); 

LUB

cb.Items.OfType<ComboBoxItem>().Any(cbi => cbi.Content.Equals("Combo")); 

Można pętla na każdej pozycji i złamać w przypadku, gdy znaleziono żądanej pozycji -

bool itemExists = false; 
foreach (ComboBoxItem cbi in cb.Items) 
{ 
    itemExists = cbi.Content.Equals("Combo"); 
    if (itemExists) break; 
} 
+0

Co sprawia, że ​​myślisz, że wpłynie to na wydajność? –

+0

Muszę to robić wiele razy na sekundę. Zmniejsza GUI. – Elmo

+0

Nie dostałem tego. 'Zawiera' również wewnętrznie pętli na całej liście, aż znalazł pożądany element. –

3

Jeśli chcesz korzystać z funkcji Contains jak w cb.Items.Contains("Combo") masz aby dodać łańcuchy do ComboBox, a nie ComboBoxItems: cb.Items.Add("Combo"). Łańcuch wyświetli się podobnie jak element ComboBoxItem.

Powiązane problemy